Single Struct

Definizione

Rappresenta un numero a virgola mobile a precisione singola.

public value class float : IComparable, IComparable<float>, IConvertible, IEquatable<float>, IFormattable
public value class float : IComparable<float>, IConvertible, IEquatable<float>, IParsable<float>, ISpanParsable<float>, IUtf8SpanParsable<float>, System::Numerics::IAdditionOperators<float, float, float>, System::Numerics::IAdditiveIdentity<float, float>, System::Numerics::IBinaryFloatingPointIeee754<float>, System::Numerics::IBinaryNumber<float>, System::Numerics::IBitwiseOperators<float, float, float>, System::Numerics::IComparisonOperators<float, float, bool>, System::Numerics::IDecrementOperators<float>, System::Numerics::IDivisionOperators<float, float, float>, System::Numerics::IEqualityOperators<float, float, bool>, System::Numerics::IExponentialFunctions<float>, System::Numerics::IFloatingPoint<float>, System::Numerics::IFloatingPointConstants<float>, System::Numerics::IFloatingPointIeee754<float>, System::Numerics::IHyperbolicFunctions<float>, System::Numerics::IIncrementOperators<float>, System::Numerics::ILogarithmicFunctions<float>, System::Numerics::IMinMaxValue<float>, System::Numerics::IModulusOperators<float, float, float>, System::Numerics::IMultiplicativeIdentity<float, float>, System::Numerics::IMultiplyOperators<float, float, float>, System::Numerics::INumber<float>, System::Numerics::INumberBase<float>, System::Numerics::IPowerFunctions<float>, System::Numerics::IRootFunctions<float>, System::Numerics::ISignedNumber<float>, System::Numerics::ISubtractionOperators<float, float, float>, System::Numerics::ITrigonometricFunctions<float>, System::Numerics::IUnaryNegationOperators<float, float>, System::Numerics::IUnaryPlusOperators<float, float>
public value class float : IComparable, IComparable<float>, IConvertible, IEquatable<float>, ISpanFormattable
public value class float : IComparable<float>, IConvertible, IEquatable<float>, IParsable<float>, ISpanParsable<float>, System::Numerics::IAdditionOperators<float, float, float>, System::Numerics::IAdditiveIdentity<float, float>, System::Numerics::IBinaryFloatingPointIeee754<float>, System::Numerics::IBinaryNumber<float>, System::Numerics::IBitwiseOperators<float, float, float>, System::Numerics::IComparisonOperators<float, float, bool>, System::Numerics::IDecrementOperators<float>, System::Numerics::IDivisionOperators<float, float, float>, System::Numerics::IEqualityOperators<float, float, bool>, System::Numerics::IExponentialFunctions<float>, System::Numerics::IFloatingPoint<float>, System::Numerics::IFloatingPointConstants<float>, System::Numerics::IFloatingPointIeee754<float>, System::Numerics::IHyperbolicFunctions<float>, System::Numerics::IIncrementOperators<float>, System::Numerics::ILogarithmicFunctions<float>, System::Numerics::IMinMaxValue<float>, System::Numerics::IModulusOperators<float, float, float>, System::Numerics::IMultiplicativeIdentity<float, float>, System::Numerics::IMultiplyOperators<float, float, float>, System::Numerics::INumber<float>, System::Numerics::INumberBase<float>, System::Numerics::IPowerFunctions<float>, System::Numerics::IRootFunctions<float>, System::Numerics::ISignedNumber<float>, System::Numerics::ISubtractionOperators<float, float, float>, System::Numerics::ITrigonometricFunctions<float>, System::Numerics::IUnaryNegationOperators<float, float>, System::Numerics::IUnaryPlusOperators<float, float>
public value class float : IComparable, IConvertible, IFormattable
public value class float : IComparable, IComparable<float>, IEquatable<float>, IFormattable
public struct Single : IComparable, IComparable<float>, IConvertible, IEquatable<float>, IFormattable
public readonly struct Single : IComparable<float>, IConvertible, IEquatable<float>, IParsable<float>, ISpanParsable<float>, IUtf8SpanParsable<float>, System.Numerics.IAdditionOperators<float,float,float>, System.Numerics.IAdditiveIdentity<float,float>, System.Numerics.IBinaryFloatingPointIeee754<float>, System.Numerics.IBinaryNumber<float>, System.Numerics.IBitwiseOperators<float,float,float>, System.Numerics.IComparisonOperators<float,float,bool>, System.Numerics.IDecrementOperators<float>, System.Numerics.IDivisionOperators<float,float,float>, System.Numerics.IEqualityOperators<float,float,bool>, System.Numerics.IExponentialFunctions<float>, System.Numerics.IFloatingPoint<float>, System.Numerics.IFloatingPointConstants<float>, System.Numerics.IFloatingPointIeee754<float>, System.Numerics.IHyperbolicFunctions<float>, System.Numerics.IIncrementOperators<float>, System.Numerics.ILogarithmicFunctions<float>, System.Numerics.IMinMaxValue<float>, System.Numerics.IModulusOperators<float,float,float>, System.Numerics.IMultiplicativeIdentity<float,float>, System.Numerics.IMultiplyOperators<float,float,float>, System.Numerics.INumber<float>, System.Numerics.INumberBase<float>, System.Numerics.IPowerFunctions<float>, System.Numerics.IRootFunctions<float>, System.Numerics.ISignedNumber<float>, System.Numerics.ISubtractionOperators<float,float,float>, System.Numerics.ITrigonometricFunctions<float>, System.Numerics.IUnaryNegationOperators<float,float>, System.Numerics.IUnaryPlusOperators<float,float>
public readonly struct Single : IComparable, IComparable<float>, IConvertible, IEquatable<float>, IFormattable
public readonly struct Single : IComparable, IComparable<float>, IConvertible, IEquatable<float>, ISpanFormattable
public readonly struct Single : IComparable<float>, IConvertible, IEquatable<float>, IParsable<float>, ISpanParsable<float>, System.Numerics.IAdditionOperators<float,float,float>, System.Numerics.IAdditiveIdentity<float,float>, System.Numerics.IBinaryFloatingPointIeee754<float>, System.Numerics.IBinaryNumber<float>, System.Numerics.IBitwiseOperators<float,float,float>, System.Numerics.IComparisonOperators<float,float,bool>, System.Numerics.IDecrementOperators<float>, System.Numerics.IDivisionOperators<float,float,float>, System.Numerics.IEqualityOperators<float,float,bool>, System.Numerics.IExponentialFunctions<float>, System.Numerics.IFloatingPoint<float>, System.Numerics.IFloatingPointConstants<float>, System.Numerics.IFloatingPointIeee754<float>, System.Numerics.IHyperbolicFunctions<float>, System.Numerics.IIncrementOperators<float>, System.Numerics.ILogarithmicFunctions<float>, System.Numerics.IMinMaxValue<float>, System.Numerics.IModulusOperators<float,float,float>, System.Numerics.IMultiplicativeIdentity<float,float>, System.Numerics.IMultiplyOperators<float,float,float>, System.Numerics.INumber<float>, System.Numerics.INumberBase<float>, System.Numerics.IPowerFunctions<float>, System.Numerics.IRootFunctions<float>, System.Numerics.ISignedNumber<float>, System.Numerics.ISubtractionOperators<float,float,float>, System.Numerics.ITrigonometricFunctions<float>, System.Numerics.IUnaryNegationOperators<float,float>, System.Numerics.IUnaryPlusOperators<float,float>
[System.Serializable]
public struct Single : IComparable, IConvertible, IFormattable
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public struct Single : IComparable, IComparable<float>, IConvertible, IEquatable<float>, IFormattable
public struct Single : IComparable, IComparable<float>, IEquatable<float>, IFormattable
type single = struct
    interface IConvertible
    interface IFormattable
type single = struct
    interface IConvertible
    interface IFormattable
    interface IParsable<single>
    interface ISpanFormattable
    interface ISpanParsable<single>
    interface IUtf8SpanFormattable
    interface IUtf8SpanParsable<single>
    interface IAdditionOperators<single, single, single>
    interface IAdditiveIdentity<single, single>
    interface IBinaryFloatingPointIeee754<single>
    interface IBinaryNumber<single>
    interface IBitwiseOperators<single, single, single>
    interface IComparisonOperators<single, single, bool>
    interface IEqualityOperators<single, single, bool>
    interface IDecrementOperators<single>
    interface IDivisionOperators<single, single, single>
    interface IIncrementOperators<single>
    interface IModulusOperators<single, single, single>
    interface IMultiplicativeIdentity<single, single>
    interface IMultiplyOperators<single, single, single>
    interface INumber<single>
    interface INumberBase<single>
    interface ISubtractionOperators<single, single, single>
    interface IUnaryNegationOperators<single, single>
    interface IUnaryPlusOperators<single, single>
    interface IExponentialFunctions<single>
    interface IFloatingPointConstants<single>
    interface IFloatingPoint<single>
    interface ISignedNumber<single>
    interface IFloatingPointIeee754<single>
    interface IHyperbolicFunctions<single>
    interface ILogarithmicFunctions<single>
    interface IPowerFunctions<single>
    interface IRootFunctions<single>
    interface ITrigonometricFunctions<single>
    interface IMinMaxValue<single>
type single = struct
    interface IConvertible
    interface ISpanFormattable
    interface IFormattable
type single = struct
    interface IConvertible
    interface IFormattable
    interface IParsable<single>
    interface ISpanFormattable
    interface ISpanParsable<single>
    interface IAdditionOperators<single, single, single>
    interface IAdditiveIdentity<single, single>
    interface IBinaryFloatingPointIeee754<single>
    interface IBinaryNumber<single>
    interface IBitwiseOperators<single, single, single>
    interface IComparisonOperators<single, single, bool>
    interface IEqualityOperators<single, single, bool>
    interface IDecrementOperators<single>
    interface IDivisionOperators<single, single, single>
    interface IIncrementOperators<single>
    interface IModulusOperators<single, single, single>
    interface IMultiplicativeIdentity<single, single>
    interface IMultiplyOperators<single, single, single>
    interface INumber<single>
    interface INumberBase<single>
    interface ISubtractionOperators<single, single, single>
    interface IUnaryNegationOperators<single, single>
    interface IUnaryPlusOperators<single, single>
    interface IExponentialFunctions<single>
    interface IFloatingPointConstants<single>
    interface IFloatingPoint<single>
    interface ISignedNumber<single>
    interface IFloatingPointIeee754<single>
    interface IHyperbolicFunctions<single>
    interface ILogarithmicFunctions<single>
    interface IPowerFunctions<single>
    interface IRootFunctions<single>
    interface ITrigonometricFunctions<single>
    interface IMinMaxValue<single>
type single = struct
    interface IConvertible
    interface IFormattable
    interface IParsable<single>
    interface ISpanFormattable
    interface ISpanParsable<single>
    interface IAdditionOperators<single, single, single>
    interface IAdditiveIdentity<single, single>
    interface IBinaryFloatingPointIeee754<single>
    interface IBinaryNumber<single>
    interface IBitwiseOperators<single, single, single>
    interface IComparisonOperators<single, single, bool>
    interface IEqualityOperators<single, single, bool>
    interface IDecrementOperators<single>
    interface IDivisionOperators<single, single, single>
    interface IIncrementOperators<single>
    interface IModulusOperators<single, single, single>
    interface IMultiplicativeIdentity<single, single>
    interface IMultiplyOperators<single, single, single>
    interface INumber<single>
    interface INumberBase<single>
    interface ISubtractionOperators<single, single, single>
    interface IUnaryNegationOperators<single, single>
    interface IUnaryPlusOperators<single, single>
    interface IUtf8SpanFormattable
    interface IUtf8SpanParsable<single>
    interface IExponentialFunctions<single>
    interface IFloatingPointConstants<single>
    interface IFloatingPoint<single>
    interface ISignedNumber<single>
    interface IFloatingPointIeee754<single>
    interface IHyperbolicFunctions<single>
    interface ILogarithmicFunctions<single>
    interface IPowerFunctions<single>
    interface IRootFunctions<single>
    interface ITrigonometricFunctions<single>
    interface IMinMaxValue<single>
[<System.Serializable>]
type single = struct
    interface IFormattable
    interface IConvertible
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type single = struct
    interface IFormattable
    interface IConvertible
type single = struct
    interface IFormattable
Public Structure Single
Implements IComparable, IComparable(Of Single), IConvertible, IEquatable(Of Single), IFormattable
Public Structure Single
Implements IAdditionOperators(Of Single, Single, Single), IAdditiveIdentity(Of Single, Single), IBinaryFloatingPointIeee754(Of Single), IBinaryNumber(Of Single), IBitwiseOperators(Of Single, Single, Single), IComparable(Of Single), IComparisonOperators(Of Single, Single, Boolean), IConvertible, IDecrementOperators(Of Single), IDivisionOperators(Of Single, Single, Single), IEqualityOperators(Of Single, Single, Boolean), IEquatable(Of Single), IExponentialFunctions(Of Single), IFloatingPoint(Of Single), IFloatingPointConstants(Of Single), IFloatingPointIeee754(Of Single), IHyperbolicFunctions(Of Single), IIncrementOperators(Of Single), ILogarithmicFunctions(Of Single), IMinMaxValue(Of Single), IModulusOperators(Of Single, Single, Single), IMultiplicativeIdentity(Of Single, Single), IMultiplyOperators(Of Single, Single, Single), INumber(Of Single), INumberBase(Of Single), IParsable(Of Single), IPowerFunctions(Of Single), IRootFunctions(Of Single), ISignedNumber(Of Single), ISpanParsable(Of Single), ISubtractionOperators(Of Single, Single, Single), ITrigonometricFunctions(Of Single), IUnaryNegationOperators(Of Single, Single), IUnaryPlusOperators(Of Single, Single), IUtf8SpanParsable(Of Single)
Public Structure Single
Implements IComparable, IComparable(Of Single), IConvertible, IEquatable(Of Single), ISpanFormattable
Public Structure Single
Implements IAdditionOperators(Of Single, Single, Single), IAdditiveIdentity(Of Single, Single), IBinaryFloatingPointIeee754(Of Single), IBinaryNumber(Of Single), IBitwiseOperators(Of Single, Single, Single), IComparable(Of Single), IComparisonOperators(Of Single, Single, Boolean), IConvertible, IDecrementOperators(Of Single), IDivisionOperators(Of Single, Single, Single), IEqualityOperators(Of Single, Single, Boolean), IEquatable(Of Single), IExponentialFunctions(Of Single), IFloatingPoint(Of Single), IFloatingPointConstants(Of Single), IFloatingPointIeee754(Of Single), IHyperbolicFunctions(Of Single), IIncrementOperators(Of Single), ILogarithmicFunctions(Of Single), IMinMaxValue(Of Single), IModulusOperators(Of Single, Single, Single), IMultiplicativeIdentity(Of Single, Single), IMultiplyOperators(Of Single, Single, Single), INumber(Of Single), INumberBase(Of Single), IParsable(Of Single), IPowerFunctions(Of Single), IRootFunctions(Of Single), ISignedNumber(Of Single), ISpanParsable(Of Single), ISubtractionOperators(Of Single, Single, Single), ITrigonometricFunctions(Of Single), IUnaryNegationOperators(Of Single, Single), IUnaryPlusOperators(Of Single, Single)
Public Structure Single
Implements IComparable, IConvertible, IFormattable
Public Structure Single
Implements IComparable, IComparable(Of Single), IEquatable(Of Single), IFormattable
Ereditarietà
Single
Attributi
Implementazioni
IComparable IComparable<Single> IConvertible IEquatable<Single> IFormattable IComparable<TSelf> IEquatable<TSelf> IParsable<Single> IParsable<TSelf> ISpanFormattable ISpanParsable<Single> ISpanParsable<TSelf> IUtf8SpanFormattable IUtf8SpanParsable<Single> IUtf8SpanParsable<TSelf> IAdditionOperators<Single,Single,Single> IAdditionOperators<TSelf,TSelf,TSelf> IAdditiveIdentity<Single,Single> IAdditiveIdentity<TSelf,TSelf> IBinaryFloatingPointIeee754<Single> IBinaryNumber<Single> IBinaryNumber<TSelf> IBitwiseOperators<Single,Single,Single> IBitwiseOperators<TSelf,TSelf,TSelf> IComparisonOperators<Single,Single,Boolean> IComparisonOperators<TSelf,TSelf,Boolean> IDecrementOperators<Single> IDecrementOperators<TSelf> IDivisionOperators<Single,Single,Single> IDivisionOperators<TSelf,TSelf,TSelf> IEqualityOperators<Single,Single,Boolean> IEqualityOperators<TSelf,TOther,TResult> IEqualityOperators<TSelf,TSelf,Boolean> IExponentialFunctions<Single> IExponentialFunctions<TSelf> IFloatingPoint<Single> IFloatingPoint<TSelf> IFloatingPointConstants<Single> IFloatingPointConstants<TSelf> IFloatingPointIeee754<Single> IFloatingPointIeee754<TSelf> IHyperbolicFunctions<Single> IHyperbolicFunctions<TSelf> IIncrementOperators<Single> IIncrementOperators<TSelf> ILogarithmicFunctions<Single> ILogarithmicFunctions<TSelf> IMinMaxValue<Single> IModulusOperators<Single,Single,Single> IModulusOperators<TSelf,TSelf,TSelf> IMultiplicativeIdentity<Single,Single> IMultiplicativeIdentity<TSelf,TSelf> IMultiplyOperators<Single,Single,Single> IMultiplyOperators<TSelf,TSelf,TSelf> INumber<Single> INumber<TSelf> INumberBase<Single> INumberBase<TSelf> IPowerFunctions<Single> IPowerFunctions<TSelf> IRootFunctions<Single> IRootFunctions<TSelf> ISignedNumber<Single> ISignedNumber<TSelf> ISubtractionOperators<Single,Single,Single> ISubtractionOperators<TSelf,TSelf,TSelf> ITrigonometricFunctions<Single> ITrigonometricFunctions<TSelf> IUnaryNegationOperators<Single,Single> IUnaryNegationOperators<TSelf,TSelf> IUnaryPlusOperators<Single,Single> IUnaryPlusOperators<TSelf,TSelf>

Commenti

Il tipo di valore Single rappresenta un numero a 32 bit a precisione singola con valori compresi tra -3.402823e38 e 3.402823e38, nonché zero positivo o zero negativo, PositiveInfinity, NegativeInfinitye non un numero (NaN). Si intende rappresentare valori estremamente grandi (ad esempio distanze tra pianeti o galassie) o estremamente piccole (come la massa molecolare di una sostanza in chilogrammi) e che spesso sono imprecise (come la distanza dalla terra a un altro sistema solare). Il tipo Single è conforme allo standard IEC 60559:1989 (IEEE 754) per l'aritmetica a virgola mobile binaria.

System.Single fornisce metodi per confrontare le istanze di questo tipo, convertire il valore di un'istanza nella relativa rappresentazione di stringa e convertire la rappresentazione di stringa di un numero in un'istanza di questo tipo. Per informazioni sul modo in cui i codici di specifica del formato controllano la rappresentazione di stringa dei tipi valore, vedere Tipi di formattazione, stringhe di formato numerico standarde stringhe di formato numerico personalizzato.

Rappresentazione a virgola mobile e precisione

Il tipo di dati Single archivia valori a virgola mobile a precisione singola in un formato binario a 32 bit, come illustrato nella tabella seguente.

Parte Bit
Significato o mantissa 0-22
Exponent 23-30
Segno (0 = positivo, 1 = negativo) 31

Proprio come le frazioni decimali non sono in grado di rappresentare con precisione alcuni valori frazionari (ad esempio 1/3 o Math.PI), le frazioni binarie non sono in grado di rappresentare alcuni valori frazionari. Ad esempio, 2/10, rappresentato esattamente da .2 come frazione decimale, è rappresentato da .0011111001001100 come frazione binaria, con il modello "1100" ripetuto all'infinito. In questo caso, il valore a virgola mobile fornisce una rappresentazione imprecisa del numero rappresentato. L'esecuzione di operazioni matematiche aggiuntive sul valore a virgola mobile originale aumenta spesso la mancanza di precisione. Ad esempio, se si confrontano i risultati della moltiplicazione di .3 per 10 e l'aggiunta di .3 a .3 nove volte, si noterà che l'addizione produce il risultato meno preciso, perché comporta otto operazioni in più rispetto alla moltiplicazione. Si noti che questa disparità è evidente solo se si visualizzano i due valori Single usando la stringa di formato numerico standard "R" , che, se necessario, visualizza tutte le 9 cifre di precisione supportate dal tipo di Single.

using System;

public class Example12
{
    public static void Main()
    {
        Single value = .2f;
        Single result1 = value * 10f;
        Single result2 = 0f;
        for (int ctr = 1; ctr <= 10; ctr++)
            result2 += value;

        Console.WriteLine($".2 * 10:           {result1:R}");
        Console.WriteLine($".2 Added 10 times: {result2:R}");
    }
}
// The example displays the following output:
//       .2 * 10:           2
//       .2 Added 10 times: 2.0000002
let value = 0.2f
let result1 = value * 10f
let mutable result2 = 0f
for _ = 1 to 10 do
    result2 <- result2 + value

printfn $".2 * 10:           {result1:R}"
printfn $".2 Added 10 times: {result2:R}"
// The example displays the following output:
//       .2 * 10:           2
//       .2 Added 10 times: 2.00000024
Module Example13
    Public Sub Main()
        Dim value As Single = 0.2
        Dim result1 As Single = value * 10
        Dim result2 As Single
        For ctr As Integer = 1 To 10
            result2 += value
        Next
        Console.WriteLine(".2 * 10:           {0:R}", result1)
        Console.WriteLine(".2 Added 10 times: {0:R}", result2)
    End Sub
End Module

' The example displays the following output:
'       .2 * 10:           2
'       .2 Added 10 times: 2.0000002

Poiché alcuni numeri non possono essere rappresentati esattamente come valori binari frazionari, i numeri a virgola mobile possono solo approssimare numeri reali.

Tutti i numeri a virgola mobile hanno un numero limitato di cifre significative, che determina anche quanto accuratamente un valore a virgola mobile approssima un numero reale. Un valore Single ha fino a 7 cifre decimali di precisione, anche se un massimo di 9 cifre viene mantenuto internamente. Ciò significa che alcune operazioni in virgola mobile potrebbero non avere la precisione necessaria per modificare un valore in virgola mobile. L'esempio seguente definisce un valore in virgola mobile a precisione singola di grandi dimensioni, e poi vi aggiunge il prodotto di Single.Epsilon e un quadrilione. Tuttavia, il prodotto è troppo piccolo per modificare il valore a virgola mobile originale. Il suo numero meno significativo è in millesimi, mentre il numero più significativo nel prodotto è 10-30.

using System;

public class Example13
{
    public static void Main()
    {
        Single value = 123.456f;
        Single additional = Single.Epsilon * 1e15f;
        Console.WriteLine($"{value} + {additional} = {value + additional}");
    }
}

// The example displays the following output:
//    123.456 + 1.401298E-30 = 123.456
open System

let value = 123.456f
let additional = Single.Epsilon * 1e15f
printfn $"{value} + {additional} = {value + additional}"
// The example displays the following output:
//    123.456 + 1.401298E-30 = 123.456
Module Example
   Public Sub Main()
      Dim value As Single = 123.456
      Dim additional As Single = Single.Epsilon * 1e15
      Console.WriteLine($"{value} + {additional} = {value + additional}")
   End Sub
End Module
' The example displays the following output:
'   123.456 + 1.401298E-30 = 123.456

La precisione limitata di un numero a virgola mobile ha diverse conseguenze:

  • Due numeri a virgola mobile che appaiono uguali per una particolare precisione potrebbero non essere uguali perché le cifre meno significative sono diverse. Nell'esempio seguente vengono sommati una serie di numeri e il totale viene confrontato con il totale previsto. Una chiamata al Equals metodo indica che i valori non sono uguali.

    using System;
    
    public class PrecisionList3Example
    {
        public static void Main()
        {
            Single[] values = { 10.01f, 2.88f, 2.88f, 2.88f, 9.0f };
            Single result = 27.65f;
            Single total = 0f;
            foreach (var value in values)
                total += value;
    
            if (total.Equals(result))
                Console.WriteLine("The sum of the values equals the total.");
            else
                Console.WriteLine($"The sum of the values ({total}) does not equal the total ({result}).");
        }
    }
    
    // The example displays the following output on .NET:
    //      The sum of the values (27.650002) does not equal the total (27.65).
    // The example displays the following output on .NET Framework:
    //      The sum of the values (27.65) does not equal the total (27.65).
    
    let values = [| 10.01f; 2.88f; 2.88f; 2.88f; 9f |]
    let result = 27.65f
    let mutable total = 0f
    for value in values do
        total <- total + value
    
    if total.Equals result then
        printfn "The sum of the values equals the total."
    else
        printfn "The sum of the values ({total}) does not equal the total ({result})."
    // The example displays the following output:
    //      The sum of the values (27.65) does not equal the total (27.65).   
    //
    // If the index items in the Console.WriteLine statement are changed to {0:R},
    // the example displays the following output:
    //       The sum of the values (27.6500015) does not equal the total (27.65).
    
        Dim values() As Single = {10.01, 2.88, 2.88, 2.88, 9.0}
        Dim result As Single = 27.65
        Dim total As Single
        For Each value In values
            total += value
        Next
        If total.Equals(result) Then
            Console.WriteLine("The sum of the values equals the total.")
        Else
            Console.WriteLine($"The sum of the values ({total}) does not equal the total ({result}).")
        End If
    End Sub
    
    ' The example displays the following output on .NET:
    '      The sum of the values (27.650002) does not equal the total (27.65).
    ' The example displays the following output on .NET Framework:
    '      The sum of the values (27.65) does not equal the total (27.65).
    

    I due valori sono diversi a causa di una perdita di precisione durante le operazioni di addizione. In questo caso, il problema può essere risolto chiamando il metodo Math.Round(Double, Int32) per arrotondare i valori Single alla precisione desiderata prima di eseguire il confronto.

  • Un'operazione matematica o di confronto che utilizza un numero a virgola mobile potrebbe non restituire lo stesso risultato se viene utilizzato un numero decimale, perché il numero a virgola mobile binario potrebbe non essere uguale al numero decimale. Un esempio precedente ha illustrato questa operazione visualizzando il risultato della moltiplicazione di .3 per 10 e l'aggiunta di .3 a .3 nove volte.

    Quando l'accuratezza nelle operazioni numeriche con valori frazionari è importante, usare il tipo Decimal anziché il tipo Single. Quando l'accuratezza nelle operazioni numeriche con valori integrali oltre l'intervallo dei tipi Int64 o UInt64 è importante, usare il tipo di BigInteger.

  • I valori di Single hanno una precisione inferiore rispetto ai valori di Double. Un valore Single convertito in un Double apparentemente equivalente spesso non è uguale al valore Double a causa delle differenze di precisione. Nell'esempio seguente il risultato di operazioni di divisione identiche viene assegnato a un valore Double e a un valore Single. Dopo il cast del valore Single a un Double, un confronto tra i due valori mostra che non sono uguali.

    using System;
    
    public class Example9
    {
        public static void Run()
        {
            double value1 = 1 / 3.0;
            float sValue2 = 1 / 3.0f;
            double value2 = (double)sValue2;
            Console.WriteLine($"{value1:R} = {value2:R}: {value1.Equals(value2)}");
        }
    }
    
    // The example displays the following output:
    //        0.33333333333333331 = 0.3333333432674408: False
    
    open System
    
    let value1 = 1. / 3.
    let sValue2 = 1f /3f
    
    let value2 = double sValue2
    printfn $"{value1:R} = {value2:R}: {value1.Equals value2}"
    // The example displays the following output:
    //        0.33333333333333331 = 0.3333333432674408: False
    
    Module Example10
        Public Sub Run()
            Dim value1 As Double = 1 / 3
            Dim sValue2 As Single = 1 / 3
            Dim value2 As Double = CDbl(sValue2)
            Console.WriteLine("{0} = {1}: {2}", value1, value2, value1.Equals(value2))
        End Sub
    End Module
    ' The example displays the following output:
    '       0.33333333333333331 = 0.3333333432674408: False
    

    Per evitare questo problema, usare il tipo di dati Double al posto del tipo di dati Single oppure usare il metodo Round in modo che entrambi i valori abbiano la stessa precisione.

Verificare l'uguaglianza

Per essere considerati uguali, due valori Single devono rappresentare valori identici. Tuttavia, a causa delle differenze di precisione tra valori o a causa di una perdita di precisione di uno o entrambi i valori, i valori a virgola mobile che dovrebbero essere identici spesso risultano diversi a causa delle differenze nelle cifre meno significative. Di conseguenza, le chiamate al metodo Equals per determinare se due valori sono uguali o chiamate al metodo CompareTo per determinare la relazione tra due valori Single, spesso producono risultati imprevisti. Questo è evidente nell'esempio seguente, in cui due valori apparentemente uguali Single risultano diversi, perché il primo valore ha 7 cifre di precisione, mentre il secondo valore ha 9.

using System;

public class Example
{
   public static void Main()
   {
      float value1 = .3333333f;
      float value2 = 1.0f/3;
      Console.WriteLine($"{value1:R} = {value2:R}: {value1.Equals(value2)}");
   }
}
// The example displays the following output:
//        0.3333333 = 0.333333343: False
let value1 = 0.3333333f
let value2 = 1f / 3f
printfn $"{value1:R} = {value2:R}: {value1.Equals value2}"
// The example displays the following output:
//        0.3333333 = 0.333333343: False
Module Example1
    Public Sub Main()
        Dim value1 As Single = 0.3333333
        Dim value2 As Single = 1 / 3
        Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2, value1.Equals(value2))
    End Sub
End Module
' The example displays the following output:
'       0.3333333 = 0.333333343: False

I valori calcolati che seguono percorsi di codice diversi e che vengono modificati in modi diversi spesso risultano diversi. Nell'esempio seguente, un valore Single è quadrato e quindi viene calcolata la radice quadrata per ripristinare il valore originale. Un secondo Single viene moltiplicato per 3,51 e poi quadrato; successivamente, la radice quadrata del risultato viene divisa per 3,51 per ripristinare il valore originale. Anche se i due valori sembrano identici, una chiamata al metodo Equals(Single) indica che non sono uguali.

float value1 = 10.201438f;
value1 = (float)Math.Sqrt((float)Math.Pow(value1, 2));
float value2 = (float)Math.Pow((float)value1 * 3.51f, 2);
value2 = ((float)Math.Sqrt(value2)) / 3.51f;
Console.WriteLine($"{value1} = {value2}: {value1.Equals(value2)}");

// The example displays the following output on .NET:
//       10.201438 = 10.201439: False
// The example displays the following output on .NET Framework:
//       10.20144 = 10.20144: False
let value1 = 
    10.201438f ** 2f
    |> sqrt

let value2 =
   ((value1 * 3.51f) ** 2f |> sqrt) / 3.51f

printfn $"{value1} = {value2}: {value1.Equals value2}\n" 
printfn $"{value1:G9} = {value2:G9}"
// The example displays the following output:
//       10.20144 = 10.20144: False
//       
//       10.201438 = 10.2014389
Dim value1 As Single = 10.201438
value1 = CSng(Math.Sqrt(CSng(Math.Pow(value1, 2))))
Dim value2 As Single = CSng(Math.Pow(value1 * CSng(3.51), 2))
value2 = CSng(Math.Sqrt(value2) / CSng(3.51))
Console.WriteLine("{0} = {1}: {2}",
                value1, value2, value1.Equals(value2))

' The example displays the following output on .NET:
'       10.201438 = 10.201439: False
' The example displays the following output on .NET Framework:
'       10.20144 = 10.20144: False

Nei casi in cui è probabile che una perdita di precisione influisca sul risultato di un confronto, è possibile usare le tecniche seguenti anziché chiamare il metodo Equals o CompareTo:

  • Chiamare il metodo Math.Round per assicurarsi che entrambi i valori abbiano la stessa precisione. Nell'esempio seguente viene modificato un esempio precedente per usare questo approccio in modo che due valori frazionari siano equivalenti.

    float value1 = .3333333f;
    float value2 = 1.0f / 3;
    int precision = 7;
    value1 = (float)Math.Round(value1, precision);
    value2 = (float)Math.Round(value2, precision);
    Console.WriteLine($"{value1:R} = {value2:R}: {value1.Equals(value2)}");
    
    // The example displays the following output:
    //        0.3333333 = 0.3333333: True
    
    open System
    
    let value1 = 0.3333333f
    let value2 = 1f / 3f
    let precision = 7
    let value1r = Math.Round(float value1, precision) |> float32
    let value2r = Math.Round(float value2, precision) |> float32
    printfn $"{value1:R} = {value2:R}: {value1.Equals value2}"
    // The example displays the following output:
    //        0.3333333 = 0.3333333: True
    
    Module Example3
        Public Sub Main()
            Dim value1 As Single = 0.3333333
            Dim value2 As Single = 1 / 3
            Dim precision As Integer = 7
            value1 = CSng(Math.Round(value1, precision))
            value2 = CSng(Math.Round(value2, precision))
            Console.WriteLine("{0:R} = {1:R}: {2}", value1, value2, value1.Equals(value2))
        End Sub
    End Module
    ' The example displays the following output:
    '       0.3333333 = 0.3333333: True
    

    Il problema della precisione si applica ancora all'arrotondamento dei valori del punto intermedio. Per altre informazioni, vedere il metodo Math.Round(Double, Int32, MidpointRounding).

  • Verificare l'uguaglianza approssimativa anziché l'uguaglianza. Questa tecnica richiede che si definisca una quantità assoluta in base alla quale i due valori possono essere diversi ma comunque uguali o che si definisce una quantità relativa in base alla quale il valore più piccolo può divergere dal valore più grande.

    Avvertimento

    Single.Epsilon viene talvolta usato come misura assoluta della distanza tra due valori Single durante il test dell'uguaglianza. Tuttavia, Single.Epsilon misura il valore più piccolo possibile a cui è possibile aggiungere o sottrarre un Single il cui valore è zero. Per la maggior parte dei valori di Single positivi e negativi, il valore di Single.Epsilon è troppo piccolo da rilevare. Pertanto, ad eccezione dei valori pari a zero, non è consigliabile usarlo nei test per verificarne l'uguaglianza.

    Nell'esempio seguente viene usato il secondo approccio per definire un metodo IsApproximatelyEqual che verifica la differenza relativa tra due valori. Confronta anche i risultati delle chiamate al metodo IsApproximatelyEqual e al metodo Equals(Single).

    public static void Main()
    {
        float one1 = .1f * 10;
        float one2 = 0f;
        for (int ctr = 1; ctr <= 10; ctr++)
            one2 += .1f;
    
        Console.WriteLine($"{one1:R} = {one2:R}: {one1.Equals(one2)}");
        Console.WriteLine($"{one1:R} is approximately equal to {one2:R}: " +
            $"{IsApproximatelyEqual(one1, one2, .000001f)}");
    
        float negativeOne1 = -1 * one1;
        float negativeOne2 = -1 * one2;
    
        Console.WriteLine($"{negativeOne1:R} = {negativeOne2:R}: {negativeOne1.Equals(negativeOne2)}");
        Console.WriteLine($"{negativeOne1:R} is approximately equal to {negativeOne2:R}: " +
            $"{IsApproximatelyEqual(negativeOne1, negativeOne2, .000001f)}");
    }
    
    static bool IsApproximatelyEqual(float value1, float value2, float epsilon)
    {
        // If they are equal anyway, just return True.
        if (value1.Equals(value2))
            return true;
    
        // Handle NaN, Infinity.
        if (Double.IsInfinity(value1) | Double.IsNaN(value1))
            return value1.Equals(value2);
        else if (Double.IsInfinity(value2) | Double.IsNaN(value2))
            return value1.Equals(value2);
    
        // Handle zero to avoid division by zero.
        double divisor = Math.Max(value1, value2);
        if (divisor.Equals(0))
            divisor = Math.Min(value1, value2);
    
        return Math.Abs((value1 - value2) / divisor) <= epsilon;
    }
    
    // The example displays the following output on .NET:
    //       1 = 1.0000001: False
    //       1 is approximately equal to 1.0000001: True
    //       -1 = -1.0000001: False
    //       -1 is approximately equal to -1.0000001: True
    
    open System
    
    let isApproximatelyEqual value1 value2 epsilon =
        // If they are equal anyway, just return True.
        if value1.Equals value2 then 
            true
        // Handle NaN, Infinity.
        elif Single.IsInfinity value1 || Single.IsNaN value1 then
            value1.Equals value2
        elif Single.IsInfinity value2 || Single.IsNaN value2 then
            value1.Equals value2
        else
            // Handle zero to avoid division by zero
            let divisor = max value1 value2
            let divisor = 
                if divisor.Equals 0 then
                    min value1 value2
                else divisor
            abs (value1 - value2) / divisor <= epsilon           
    
    
    let one1 = 0.1f * 10f
    let mutable one2 = 0f
    for _ = 1 to 10 do
       one2 <- one2 + 0.1f
    
    printfn $"{one1:R} = {one2:R}: {one1.Equals one2}"
    printfn $"{one1:R} is approximately equal to {one2:R}: {isApproximatelyEqual one1 one2 0.000001f}" 
    // The example displays the following output:
    //       1 = 1.00000012: False
    //       1 is approximately equal to 1.00000012: True
    
    Public Sub Main()
        Dim one1 As Single = 0.1 * 10
        Dim one2 As Single = 0
        For ctr As Integer = 1 To 10
            one2 += CSng(0.1)
        Next
        Console.WriteLine("{0:R} = {1:R}: {2}", one1, one2, one1.Equals(one2))
        Console.WriteLine("{0:R} is approximately equal to {1:R}: {2}",
                        one1, one2,
                        IsApproximatelyEqual(one1, one2, 0.000001))
    End Sub
    
    Function IsApproximatelyEqual(value1 As Single, value2 As Single,
                                 epsilon As Single) As Boolean
        ' If they are equal anyway, just return True.
        If value1.Equals(value2) Then Return True
    
        ' Handle NaN, Infinity.
        If Single.IsInfinity(value1) Or Single.IsNaN(value1) Then
            Return value1.Equals(value2)
        ElseIf Single.IsInfinity(value2) Or Single.IsNaN(value2) Then
            Return value1.Equals(value2)
        End If
    
        ' Handle zero to avoid division by zero.
        Dim divisor As Single = Math.Max(value1, value2)
        If divisor.Equals(0) Then
            divisor = Math.Min(value1, value2)
        End If
    
        Return Math.Abs(value1 - value2) / divisor <= epsilon
    End Function
    
    ' The example displays the following output:
    '       1 = 1.0000001: False
    '       1 is approximately equal to 1.0000001: True
    

Valori a virgola mobile ed eccezioni

Le operazioni con valori a virgola mobile non generano eccezioni, a differenza delle operazioni con tipi integrali, che generano eccezioni nei casi di operazioni non valide, ad esempio divisione per zero o overflow. In queste situazioni, invece, il risultato di un'operazione a virgola mobile è zero, infinito positivo, infinito negativo o non un numero (NaN):

  • Se il risultato di un'operazione a virgola mobile è troppo piccolo per il formato di destinazione, il risultato è zero. Ciò può verificarsi quando vengono moltiplicati due numeri a virgola mobile molto piccoli, come illustrato nell'esempio seguente.

    float value1 = 1.163287e-36f;
    float value2 = 9.164234e-25f;
    float result = value1 * value2;
    Console.WriteLine($"{value1} * {value2} = {result}");
    Console.WriteLine($"{result} = 0: {result.Equals(0.0f)}");
    
    // The example displays the following output:
    //       1.163287E-36 * 9.164234E-25 = 0
    //       0 = 0: True
    
    let value1 = 1.163287e-36f
    let value2 = 9.164234e-25f
    let result = value1 * value2
    printfn $"{value1} * {value2} = {result}"
    printfn $"{result} = 0: {result.Equals(0f)}"
    // The example displays the following output:
    //       1.163287E-36 * 9.164234E-25 = 0
    //       0 = 0: True
    
    Module Example7
        Public Sub Main()
            Dim value1 As Single = 1.163287E-36
            Dim value2 As Single = 9.164234E-25
            Dim result As Single = value1 * value2
            Console.WriteLine("{0} * {1} = {2:R}", value1, value2, result)
            Console.WriteLine("{0} = 0: {1}", result, result.Equals(0))
        End Sub
    End Module
    ' The example displays the following output:
    '       1.163287E-36 * 9.164234E-25 = 0
    '       0 = 0: True
    
  • Se la grandezza del risultato di un'operazione a virgola mobile supera l'intervallo del formato di destinazione, il risultato dell'operazione è PositiveInfinity o NegativeInfinity, come appropriato per il segno del risultato. Il risultato di un'operazione che esegue l'overflow Single.MaxValue è PositiveInfinitye il risultato di un'operazione che esegue l'overflow Single.MinValue è NegativeInfinity, come illustrato nell'esempio seguente.

    float value1 = 3.065e35f;
    float value2 = 6.9375e32f;
    float result = value1 * value2;
    Console.WriteLine($"PositiveInfinity: {Single.IsPositiveInfinity(result)}");
    Console.WriteLine($"NegativeInfinity: {Single.IsNegativeInfinity(result)}");
    Console.WriteLine();
    
    value1 = -value1;
    result = value1 * value2;
    Console.WriteLine($"PositiveInfinity: {Single.IsPositiveInfinity(result)}");
    Console.WriteLine($"NegativeInfinity: {Single.IsNegativeInfinity(result)}");
    
    // The example displays the following output:
    //       PositiveInfinity: True
    //       NegativeInfinity: False
    //
    //       PositiveInfinity: False
    //       NegativeInfinity: True
    
    open System
    
    let value1 = 3.065e35f
    let value2 = 6.9375e32f
    let result = value1 * value2
    printfn $"PositiveInfinity: {Single.IsPositiveInfinity result}" 
    printfn $"NegativeInfinity: {Single.IsNegativeInfinity result}\n"
    
    let value3 = -value1
    let result2 = value3 * value2
    printfn $"PositiveInfinity: {Single.IsPositiveInfinity result}" 
    printfn $"NegativeInfinity: {Single.IsNegativeInfinity result}" 
    
    // The example displays the following output:
    //       PositiveInfinity: True
    //       NegativeInfinity: False
    //       
    //       PositiveInfinity: False
    //       NegativeInfinity: True
    
    Module Example8
        Public Sub Main()
            Dim value1 As Single = 3.065E+35
            Dim value2 As Single = 6.9375E+32
            Dim result As Single = value1 * value2
            Console.WriteLine("PositiveInfinity: {0}",
                             Single.IsPositiveInfinity(result))
            Console.WriteLine("NegativeInfinity: {0}",
                            Single.IsNegativeInfinity(result))
            Console.WriteLine()
            value1 = -value1
            result = value1 * value2
            Console.WriteLine("PositiveInfinity: {0}",
                             Single.IsPositiveInfinity(result))
            Console.WriteLine("NegativeInfinity: {0}",
                            Single.IsNegativeInfinity(result))
        End Sub
    End Module
    ' The example displays the following output:
    '       PositiveInfinity: True
    '       NegativeInfinity: False
    '       
    '       PositiveInfinity: False
    '       NegativeInfinity: True
    

    PositiveInfinity risulta anche da una divisione per zero con un dividendo positivo, e NegativeInfinity risulta da una divisione per zero con un dividendo negativo.

  • Se un'operazione in virgola mobile è invalida, il risultato dell'operazione è NaN. Ad esempio, NaN risulta dalle seguenti operazioni:

    • Divisione per zero con dividendo pari a zero. Si noti che altri casi di divisione per zero comportano PositiveInfinity o NegativeInfinity.
    • Qualsiasi operazione in virgola mobile con input non valido. Ad esempio, il tentativo di trovare la radice quadrata di un valore negativo restituisce NaN.
    • Qualsiasi operazione con un argomento con valore pari a Single.NaN.

Conversioni di tipo

La struttura Single non definisce operatori di conversione espliciti o impliciti; Le conversioni vengono invece implementate dal compilatore.

Nella tabella seguente sono elencate le possibili conversioni di un valore degli altri tipi numerici primitivi in un Single valore. Indica inoltre se la conversione è più ampia o ridotta e se il risultato Single può avere una precisione minore rispetto al valore originale.

Conversione da Allargamento/restringimento Possibile perdita di precisione
Byte Ampliamento No
Decimal Ampliamento

Si noti che C# richiede un operatore cast.
Yes. Decimal supporta 29 cifre decimali di precisione; Single supporta 9.
Double Restringimento; i valori fuori intervallo vengono convertiti in Double.NegativeInfinity o Double.PositiveInfinity. Yes. Double supporta 17 cifre decimali di precisione; Single supporta 9.
Int16 Ampliamento No
Int32 Ampliamento Yes. Int32 supporta 10 cifre decimali di precisione; Single supporta 9.
Int64 Ampliamento Yes. Int64 supporta 19 cifre decimali di precisione; Single supporta 9.
SByte Ampliamento No
UInt16 Ampliamento No
UInt32 Ampliamento Yes. UInt32 supporta 10 cifre decimali di precisione; Single supporta 9.
UInt64 Ampliamento Yes. Int64 supporta 20 cifre decimali di precisione; Single supporta 9.

Nell'esempio seguente viene convertito il valore minimo o massimo di altri tipi numerici primitivi in un valore Single.

using System;

public class Example4
{
    public static void Main()
    {
        dynamic[] values = { Byte.MinValue, Byte.MaxValue, Decimal.MinValue,
                           Decimal.MaxValue, Double.MinValue, Double.MaxValue,
                           Int16.MinValue, Int16.MaxValue, Int32.MinValue,
                           Int32.MaxValue, Int64.MinValue, Int64.MaxValue,
                           SByte.MinValue, SByte.MaxValue, UInt16.MinValue,
                           UInt16.MaxValue, UInt32.MinValue, UInt32.MaxValue,
                           UInt64.MinValue, UInt64.MaxValue };
        float sngValue;
        foreach (var value in values)
        {
            if (value.GetType() == typeof(Decimal) ||
                value.GetType() == typeof(Double))
                sngValue = (float)value;
            else
                sngValue = value;
            Console.WriteLine($"{value} ({value.GetType().Name}) --> {sngValue:R} ({sngValue.GetType().Name})");
        }
    }
}
// The example displays the following output:
//       0 (Byte) --> 0 (Single)
//       255 (Byte) --> 255 (Single)
//       -79228162514264337593543950335 (Decimal) --> -7.92281625E+28 (Single)
//       79228162514264337593543950335 (Decimal) --> 7.92281625E+28 (Single)
//       -1.79769313486232E+308 (Double) --> -Infinity (Single)
//       1.79769313486232E+308 (Double) --> Infinity (Single)
//       -32768 (Int16) --> -32768 (Single)
//       32767 (Int16) --> 32767 (Single)
//       -2147483648 (Int32) --> -2.14748365E+09 (Single)
//       2147483647 (Int32) --> 2.14748365E+09 (Single)
//       -9223372036854775808 (Int64) --> -9.223372E+18 (Single)
//       9223372036854775807 (Int64) --> 9.223372E+18 (Single)
//       -128 (SByte) --> -128 (Single)
//       127 (SByte) --> 127 (Single)
//       0 (UInt16) --> 0 (Single)
//       65535 (UInt16) --> 65535 (Single)
//       0 (UInt32) --> 0 (Single)
//       4294967295 (UInt32) --> 4.2949673E+09 (Single)
//       0 (UInt64) --> 0 (Single)
//       18446744073709551615 (UInt64) --> 1.84467441E+19 (Single)
open System

let values: obj list = 
    [ Byte.MinValue; Byte.MaxValue; Decimal.MinValue
      Decimal.MaxValue; Double.MinValue; Double.MaxValue
      Int16.MinValue; Int16.MaxValue; Int32.MinValue
      Int32.MaxValue; Int64.MinValue; Int64.MaxValue
      SByte.MinValue; SByte.MaxValue; UInt16.MinValue
      UInt16.MaxValue; UInt32.MinValue; UInt32.MaxValue
      UInt64.MinValue; UInt64.MaxValue ]

for value in values do
    let sngValue = 
        match value with
        | :? byte as v -> float32 v
        | :? decimal as v -> float32 v
        | :? double as v -> float32 v
        | :? int16 as v -> float32 v
        | :? int as v -> float32 v
        | :? int64 as v -> float32 v
        | :? int8 as v -> float32 v
        | :? uint16 as v -> float32 v
        | :? uint as v -> float32 v
        | :? uint64 as v -> float32 v
        | _ -> raise (NotImplementedException "Unknown Type")
    printfn $"{value} ({value.GetType().Name}) --> {sngValue:R} ({sngValue.GetType().Name})"
// The example displays the following output:
//       0 (Byte) --> 0 (Single)
//       255 (Byte) --> 255 (Single)
//       -79228162514264337593543950335 (Decimal) --> -7.92281625E+28 (Single)
//       79228162514264337593543950335 (Decimal) --> 7.92281625E+28 (Single)
//       -1.79769313486232E+308 (Double) --> -Infinity (Single)
//       1.79769313486232E+308 (Double) --> Infinity (Single)
//       -32768 (Int16) --> -32768 (Single)
//       32767 (Int16) --> 32767 (Single)
//       -2147483648 (Int32) --> -2.14748365E+09 (Single)
//       2147483647 (Int32) --> 2.14748365E+09 (Single)
//       -9223372036854775808 (Int64) --> -9.223372E+18 (Single)
//       9223372036854775807 (Int64) --> 9.223372E+18 (Single)
//       -128 (SByte) --> -128 (Single)
//       127 (SByte) --> 127 (Single)
//       0 (UInt16) --> 0 (Single)
//       65535 (UInt16) --> 65535 (Single)
//       0 (UInt32) --> 0 (Single)
//       4294967295 (UInt32) --> 4.2949673E+09 (Single)
//       0 (UInt64) --> 0 (Single)
//       18446744073709551615 (UInt64) --> 1.84467441E+19 (Single)
Module Example5
    Public Sub Main()
        Dim values() As Object = {Byte.MinValue, Byte.MaxValue, Decimal.MinValue,
                                 Decimal.MaxValue, Double.MinValue, Double.MaxValue,
                                 Int16.MinValue, Int16.MaxValue, Int32.MinValue,
                                 Int32.MaxValue, Int64.MinValue, Int64.MaxValue,
                                 SByte.MinValue, SByte.MaxValue, UInt16.MinValue,
                                 UInt16.MaxValue, UInt32.MinValue, UInt32.MaxValue,
                                 UInt64.MinValue, UInt64.MaxValue}
        Dim sngValue As Single
        For Each value In values
            If value.GetType() = GetType(Double) Then
                sngValue = CSng(value)
            Else
                sngValue = value
            End If
            Console.WriteLine("{0} ({1}) --> {2:R} ({3})",
                           value, value.GetType().Name,
                           sngValue, sngValue.GetType().Name)
        Next
    End Sub
End Module
' The example displays the following output:
'       0 (Byte) --> 0 (Single)
'       255 (Byte) --> 255 (Single)
'       -79228162514264337593543950335 (Decimal) --> -7.92281625E+28 (Single)
'       79228162514264337593543950335 (Decimal) --> 7.92281625E+28 (Single)
'       -1.79769313486232E+308 (Double) --> -Infinity (Single)
'       1.79769313486232E+308 (Double) --> Infinity (Single)
'       -32768 (Int16) --> -32768 (Single)
'       32767 (Int16) --> 32767 (Single)
'       -2147483648 (Int32) --> -2.14748365E+09 (Single)
'       2147483647 (Int32) --> 2.14748365E+09 (Single)
'       -9223372036854775808 (Int64) --> -9.223372E+18 (Single)
'       9223372036854775807 (Int64) --> 9.223372E+18 (Single)
'       -128 (SByte) --> -128 (Single)
'       127 (SByte) --> 127 (Single)
'       0 (UInt16) --> 0 (Single)
'       65535 (UInt16) --> 65535 (Single)
'       0 (UInt32) --> 0 (Single)
'       4294967295 (UInt32) --> 4.2949673E+09 (Single)
'       0 (UInt64) --> 0 (Single)
'       18446744073709551615 (UInt64) --> 1.84467441E+19 (Single)

Inoltre, i valori di DoubleDouble.NaN, Double.PositiveInfinitye Double.NegativeInfinity vengono convertiti rispettivamente in Single.NaN, Single.PositiveInfinitye Single.NegativeInfinity.

Si noti che la conversione del valore di alcuni tipi numerici in un valore Single può comportare una perdita di precisione. Come illustrato nell'esempio, è possibile una perdita di precisione quando si converte Decimal, Double, Int32, Int64, UInt32e UInt64 valori in valori Single.

La conversione di un valore Single in un Double è una conversione di ampliamento. La conversione può comportare una perdita di precisione se il tipo Double non ha una rappresentazione precisa per il valore Single.

La conversione di un valore Single in un valore di qualsiasi tipo di dati numerico primitivo diverso da un Double è una conversione di tipo narrowing e richiede un operatore cast (in C#) o un metodo di conversione (in Visual Basic). I valori che non rientrano nell'intervallo del tipo di dati di destinazione, definiti dalla MinValue del tipo di destinazione e dalle proprietà MaxValue, si comportano come illustrato nella tabella seguente.

Tipo di destinazione Result
Qualsiasi tipo integrale Eccezione OverflowException se la conversione si verifica in un contesto controllato.

Se la conversione si verifica in un contesto non controllato (impostazione predefinita in C#), l'operazione di conversione ha esito positivo ma il valore va in overflow.
Decimal Un'eccezione OverflowException.

Inoltre, Single.NaN, Single.PositiveInfinitye Single.NegativeInfinity generano un OverflowException per le conversioni in numeri interi in un contesto controllato, ma questi valori vanno in overflow quando vengono convertiti in numeri interi in un contesto non controllato. Per le conversioni in Decimal, lanciano sempre un OverflowException. Per le conversioni in Double, vengono convertite rispettivamente in Double.NaN, Double.PositiveInfinitye Double.NegativeInfinity.

Si noti che una perdita di precisione può comportare la conversione di un valore Single in un altro tipo numerico. Nel caso della conversione di valori Single non integrali, come illustrato nell'output dell'esempio, il componente frazionaria viene perso quando il valore Single viene arrotondato (come in Visual Basic) o troncato (come in C# e F#). Per le conversioni in valori Decimal, il valore Single potrebbe non avere una rappresentazione precisa nel tipo di dati di destinazione.

Nell'esempio seguente viene convertito un numero di valori Single in diversi altri tipi numerici. Le conversioni si verificano in un contesto controllato in Visual Basic (impostazione predefinita), in C# (a causa della parola chiave controllata) e in F# (a causa dell'istruzione open Checked). L'output dell'esempio mostra il risultato per le conversioni sia in un contesto verificato che non verificato. È possibile eseguire conversioni in un contesto non selezionato in Visual Basic compilando con l'opzione del compilatore /removeintchecks+, in C# commentando l'istruzione checked e in F# commentando l'istruzione open Checked.

float[] values = { Single.MinValue, -67890.1234f, -12345.6789f,
                 12345.6789f, 67890.1234f, Single.MaxValue,
                 Single.NaN, Single.PositiveInfinity,
                 Single.NegativeInfinity };
checked
{
    foreach (var value in values)
    {
        try
        {
            Int64 lValue = (long)value;
            Console.WriteLine($"{value} ({value.GetType().Name}) --> {lValue} (0x{lValue:X16}) ({lValue.GetType().Name})");
        }
        catch (OverflowException)
        {
            Console.WriteLine($"Unable to convert {value} to Int64.");
        }
        try
        {
            UInt64 ulValue = (ulong)value;
            Console.WriteLine($"{value} ({value.GetType().Name}) --> {ulValue} (0x{ulValue:X16}) ({ulValue.GetType().Name})");
        }
        catch (OverflowException)
        {
            Console.WriteLine($"Unable to convert {value} to UInt64.");
        }
        try
        {
            Decimal dValue = (decimal)value;
            Console.WriteLine($"{value} ({value.GetType().Name}) --> {dValue} ({dValue.GetType().Name})");
        }
        catch (OverflowException)
        {
            Console.WriteLine($"Unable to convert {value} to Decimal.");
        }

        Double dblValue = value;
        Console.WriteLine($"{value} ({value.GetType().Name}) --> {dblValue} ({dblValue.GetType().Name})");
        Console.WriteLine();
    }
}

// The example displays the following output for conversions performed
// in a checked context:
//       Unable to convert -3.402823E+38 to Int64.
//       Unable to convert -3.402823E+38 to UInt64.
//       Unable to convert -3.402823E+38 to Decimal.
//       -3.402823E+38 (Single) --> -3.40282346638529E+38 (Double)
//
//       -67890.13 (Single) --> -67890 (0xFFFFFFFFFFFEF6CE) (Int64)
//       Unable to convert -67890.13 to UInt64.
//       -67890.13 (Single) --> -67890.12 (Decimal)
//       -67890.13 (Single) --> -67890.125 (Double)
//
//       -12345.68 (Single) --> -12345 (0xFFFFFFFFFFFFCFC7) (Int64)
//       Unable to convert -12345.68 to UInt64.
//       -12345.68 (Single) --> -12345.68 (Decimal)
//       -12345.68 (Single) --> -12345.6787109375 (Double)
//
//       12345.68 (Single) --> 12345 (0x0000000000003039) (Int64)
//       12345.68 (Single) --> 12345 (0x0000000000003039) (UInt64)
//       12345.68 (Single) --> 12345.68 (Decimal)
//       12345.68 (Single) --> 12345.6787109375 (Double)
//
//       67890.13 (Single) --> 67890 (0x0000000000010932) (Int64)
//       67890.13 (Single) --> 67890 (0x0000000000010932) (UInt64)
//       67890.13 (Single) --> 67890.12 (Decimal)
//       67890.13 (Single) --> 67890.125 (Double)
//
//       Unable to convert 3.402823E+38 to Int64.
//       Unable to convert 3.402823E+38 to UInt64.
//       Unable to convert 3.402823E+38 to Decimal.
//       3.402823E+38 (Single) --> 3.40282346638529E+38 (Double)
//
//       Unable to convert NaN to Int64.
//       Unable to convert NaN to UInt64.
//       Unable to convert NaN to Decimal.
//       NaN (Single) --> NaN (Double)
//
//       Unable to convert ∞ to Int64.
//       Unable to convert ∞ to UInt64.
//       Unable to convert ∞ to Decimal.
//       ∞ (Single) --> ∞ (Double)
//
//       Unable to convert -∞ to Int64.
//       Unable to convert -∞ to UInt64.
//       Unable to convert -∞ to Decimal.
//       -∞ (Single) --> -∞ (Double)
open System
open Checked

let values = 
    [ Single.MinValue; -67890.1234f; -12345.6789f
      12345.6789f; 67890.1234f; Single.MaxValue
      Single.NaN; Single.PositiveInfinity
      Single.NegativeInfinity ]

for value in values do
    try
        let lValue = int64 value
        printfn $"{value} ({value.GetType().Name}) --> {lValue} (0x{lValue:X16}) ({lValue.GetType().Name})"
    with :? OverflowException ->
        printfn $"Unable to convert {value} to Int64."
    try
        let ulValue = uint64 value
        printfn $"{value} ({value.GetType().Name}) --> {ulValue} (0x{ulValue:X16}) ({ulValue.GetType().Name})"
    with :? OverflowException ->
        printfn $"Unable to convert {value} to UInt64."
    try
        let dValue = decimal value
        printfn $"{value} ({value.GetType().Name}) --> {dValue} ({dValue.GetType().Name})"
    with :? OverflowException ->
        printfn $"Unable to convert {value} to Decimal."

    let dblValue = double value
    printfn $"{value} ({value.GetType().Name}) --> {dblValue} ({dblValue.GetType().Name})\n"
// The example displays the following output for conversions performed
// in a checked context:
//       Unable to convert -3.402823E+38 to Int64.
//       Unable to convert -3.402823E+38 to UInt64.
//       Unable to convert -3.402823E+38 to Decimal.
//       -3.402823E+38 (Single) --> -3.40282346638529E+38 (Double)
//
//       -67890.13 (Single) --> -67890 (0xFFFFFFFFFFFEF6CE) (Int64)
//       Unable to convert -67890.13 to UInt64.
//       -67890.13 (Single) --> -67890.12 (Decimal)
//       -67890.13 (Single) --> -67890.125 (Double)
//
//       -12345.68 (Single) --> -12345 (0xFFFFFFFFFFFFCFC7) (Int64)
//       Unable to convert -12345.68 to UInt64.
//       -12345.68 (Single) --> -12345.68 (Decimal)
//       -12345.68 (Single) --> -12345.6787109375 (Double)
//
//       12345.68 (Single) --> 12345 (0x0000000000003039) (Int64)
//       12345.68 (Single) --> 12345 (0x0000000000003039) (UInt64)
//       12345.68 (Single) --> 12345.68 (Decimal)
//       12345.68 (Single) --> 12345.6787109375 (Double)
//
//       67890.13 (Single) --> 67890 (0x0000000000010932) (Int64)
//       67890.13 (Single) --> 67890 (0x0000000000010932) (UInt64)
//       67890.13 (Single) --> 67890.12 (Decimal)
//       67890.13 (Single) --> 67890.125 (Double)
//
//       Unable to convert 3.402823E+38 to Int64.
//       Unable to convert 3.402823E+38 to UInt64.
//       Unable to convert 3.402823E+38 to Decimal.
//       3.402823E+38 (Single) --> 3.40282346638529E+38 (Double)
//
//       Unable to convert NaN to Int64.
//       Unable to convert NaN to UInt64.
//       Unable to convert NaN to Decimal.
//       NaN (Single) --> NaN (Double)
//
//       Unable to convert Infinity to Int64.
//       Unable to convert Infinity to UInt64.
//       Unable to convert Infinity to Decimal.
//       Infinity (Single) --> Infinity (Double)
//
//       Unable to convert -Infinity to Int64.
//       Unable to convert -Infinity to UInt64.
//       Unable to convert -Infinity to Decimal.
//       -Infinity (Single) --> -Infinity (Double)
// The example displays the following output for conversions performed
// in an unchecked context:
//       -3.402823E+38 (Single) --> -9223372036854775808 (0x8000000000000000) (Int64)
//       -3.402823E+38 (Single) --> 9223372036854775808 (0x8000000000000000) (UInt64)
//       Unable to convert -3.402823E+38 to Decimal.
//       -3.402823E+38 (Single) --> -3.40282346638529E+38 (Double)
//
//       -67890.13 (Single) --> -67890 (0xFFFFFFFFFFFEF6CE) (Int64)
//       -67890.13 (Single) --> 18446744073709483726 (0xFFFFFFFFFFFEF6CE) (UInt64)
//       -67890.13 (Single) --> -67890.12 (Decimal)
//       -67890.13 (Single) --> -67890.125 (Double)
//
//       -12345.68 (Single) --> -12345 (0xFFFFFFFFFFFFCFC7) (Int64)
//       -12345.68 (Single) --> 18446744073709539271 (0xFFFFFFFFFFFFCFC7) (UInt64)
//       -12345.68 (Single) --> -12345.68 (Decimal)
//       -12345.68 (Single) --> -12345.6787109375 (Double)
//
//       12345.68 (Single) --> 12345 (0x0000000000003039) (Int64)
//       12345.68 (Single) --> 12345 (0x0000000000003039) (UInt64)
//       12345.68 (Single) --> 12345.68 (Decimal)
//       12345.68 (Single) --> 12345.6787109375 (Double)
//
//       67890.13 (Single) --> 67890 (0x0000000000010932) (Int64)
//       67890.13 (Single) --> 67890 (0x0000000000010932) (UInt64)
//       67890.13 (Single) --> 67890.12 (Decimal)
//       67890.13 (Single) --> 67890.125 (Double)
//
//       3.402823E+38 (Single) --> -9223372036854775808 (0x8000000000000000) (Int64)
//       3.402823E+38 (Single) --> 0 (0x0000000000000000) (UInt64)
//       Unable to convert 3.402823E+38 to Decimal.
//       3.402823E+38 (Single) --> 3.40282346638529E+38 (Double)
//
//       NaN (Single) --> -9223372036854775808 (0x8000000000000000) (Int64)
//       NaN (Single) --> 0 (0x0000000000000000) (UInt64)
//       Unable to convert NaN to Decimal.
//       NaN (Single) --> NaN (Double)
//
//       Infinity (Single) --> -9223372036854775808 (0x8000000000000000) (Int64)
//       Infinity (Single) --> 0 (0x0000000000000000) (UInt64)
//       Unable to convert Infinity to Decimal.
//       Infinity (Single) --> Infinity (Double)
//
//       -Infinity (Single) --> -9223372036854775808 (0x8000000000000000) (Int64)
//       -Infinity (Single) --> 9223372036854775808 (0x8000000000000000) (UInt64)
//       Unable to convert -Infinity to Decimal.
//       -Infinity (Single) --> -Infinity (Double)
Module Example6
    Public Sub Main()
        Dim values() As Single = {Single.MinValue, -67890.1234, -12345.6789,
                                 12345.6789, 67890.1234, Single.MaxValue,
                                 Single.NaN, Single.PositiveInfinity,
                                 Single.NegativeInfinity}
        For Each value In values
            Try
                Dim lValue As Long = CLng(value)
                Console.WriteLine("{0} ({1}) --> {2} (0x{2:X16}) ({3})",
                               value, value.GetType().Name,
                               lValue, lValue.GetType().Name)
            Catch e As OverflowException
                Console.WriteLine("Unable to convert {0} to Int64.", value)
            End Try
            Try
                Dim ulValue As UInt64 = CULng(value)
                Console.WriteLine("{0} ({1}) --> {2} (0x{2:X16}) ({3})",
                               value, value.GetType().Name,
                               ulValue, ulValue.GetType().Name)
            Catch e As OverflowException
                Console.WriteLine("Unable to convert {0} to UInt64.", value)
            End Try
            Try
                Dim dValue As Decimal = CDec(value)
                Console.WriteLine("{0} ({1}) --> {2} ({3})",
                               value, value.GetType().Name,
                               dValue, dValue.GetType().Name)
            Catch e As OverflowException
                Console.WriteLine("Unable to convert {0} to Decimal.", value)
            End Try

            Dim dblValue As Double = value
            Console.WriteLine("{0} ({1}) --> {2} ({3})",
                           value, value.GetType().Name,
                           dblValue, dblValue.GetType().Name)
            Console.WriteLine()
        Next
    End Sub
End Module

' The example displays the following output for conversions performed
' in a checked context:
'       Unable to convert -3.402823E+38 to Int64.
'       Unable to convert -3.402823E+38 to UInt64.
'       Unable to convert -3.402823E+38 to Decimal.
'       -3.402823E+38 (Single) --> -3.40282346638529E+38 (Double)
'
'       -67890.13 (Single) --> -67890 (0xFFFFFFFFFFFEF6CE) (Int64)
'       Unable to convert -67890.13 to UInt64.
'       -67890.13 (Single) --> -67890.12 (Decimal)
'       -67890.13 (Single) --> -67890.125 (Double)
'
'       -12345.68 (Single) --> -12346 (0xFFFFFFFFFFFFCFC6) (Int64)
'       Unable to convert -12345.68 to UInt64.
'       -12345.68 (Single) --> -12345.68 (Decimal)
'       -12345.68 (Single) --> -12345.6787109375 (Double)
'
'       12345.68 (Single) --> 12346 (0x000000000000303A) (Int64)
'       12345.68 (Single) --> 12346 (0x000000000000303A) (UInt64)
'       12345.68 (Single) --> 12345.68 (Decimal)
'       12345.68 (Single) --> 12345.6787109375 (Double)
'
'       67890.13 (Single) --> 67890 (0x0000000000010932) (Int64)
'       67890.13 (Single) --> 67890 (0x0000000000010932) (UInt64)
'       67890.13 (Single) --> 67890.12 (Decimal)
'       67890.13 (Single) --> 67890.125 (Double)
'
'       Unable to convert 3.402823E+38 to Int64.
'       Unable to convert 3.402823E+38 to UInt64.
'       Unable to convert 3.402823E+38 to Decimal.
'       3.402823E+38 (Single) --> 3.40282346638529E+38 (Double)
'
'       Unable to convert NaN to Int64.
'       Unable to convert NaN to UInt64.
'       Unable to convert NaN to Decimal.
'       NaN (Single) --> NaN (Double)
'
'       Unable to convert ∞ to Int64.
'       Unable to convert ∞ to UInt64.
'       Unable to convert ∞ to Decimal.
'       ∞ (Single) --> ∞ (Double)
'
'       Unable to convert -∞ to Int64.
'       Unable to convert -∞ to UInt64.
'       Unable to convert -∞ to Decimal.
'       -∞ (Single) --> -∞ (Double)

Per ulteriori informazioni sulla conversione dei tipi numerici, vedere Conversione di tipi in .NET e Tabelle di conversione di tipi.

Funzionalità a virgola mobile

La struttura Single e i tipi correlati forniscono metodi per eseguire le categorie di operazioni seguenti:

  • Confronto dei valori. È possibile chiamare il metodo Equals per determinare se due valori Single sono uguali o il metodo CompareTo per determinare la relazione tra due valori.

    La struttura Single supporta anche un set completo di operatori di confronto. Ad esempio, è possibile verificare l'uguaglianza o la disuguaglianza oppure determinare se un valore è maggiore o uguale a un altro valore. Se uno degli operandi è un Double, il valore Single viene convertito in un Double prima di eseguire il confronto. Se uno degli operandi è un tipo integrale, viene convertito in un Single prima di eseguire il confronto. Anche se si tratta di conversioni più ampliate, possono comportare una perdita di precisione.

    Avvertimento

    A causa delle differenze di precisione, due valori Single che si prevede di essere uguali possono risultare diversi, che influiscono sul risultato del confronto. Per ulteriori informazioni sul confronto di due valori, vedere la sezione Single.

    È anche possibile chiamare i metodi IsNaN, IsInfinity, IsPositiveInfinitye IsNegativeInfinity per testare questi valori speciali.

  • Operazioni matematiche. Le operazioni aritmetiche comuni, ad esempio addizione, sottrazione, moltiplicazione e divisione, vengono implementate da compilatori di linguaggio e istruzioni CIL (Common Intermediate Language) anziché da metodi Single. Se l'altro operando in un'operazione matematica è un Double, il Single viene convertito in un Double prima di eseguire l'operazione e il risultato dell'operazione è anche un valore Double. Se l'altro operando è un tipo integrale, viene convertito in un Single prima di eseguire l'operazione e il risultato dell'operazione è anche un valore Single.

    È possibile eseguire altre operazioni matematiche chiamando metodi static (Shared in Visual Basic) nella classe System.Math. Questi includono metodi aggiuntivi comunemente usati per l'aritmetica (ad esempio Math.Abs, Math.Signe Math.Sqrt), la geometria (ad esempio Math.Cos e Math.Sin) e il calcolo (ad esempio Math.Log). In tutti i casi, il valore Single viene convertito in un Double.

    È anche possibile modificare i singoli bit in un valore Single. Il metodo BitConverter.GetBytes(Single) restituisce il modello di bit in una matrice di byte. Passando tale matrice di byte al metodo BitConverter.ToInt32, è anche possibile mantenere il modello di bit del valore Single in un numero intero a 32 bit.

  • Arrotondamento. L'arrotondamento viene spesso usato come tecnica per ridurre l'impatto delle differenze tra valori causati da problemi di rappresentazione a virgola mobile e precisione. È possibile arrotondamento di un valore Single chiamando il metodo Math.Round. Si noti tuttavia che il valore Single viene convertito in un Double prima della chiamata al metodo e la conversione può comportare una perdita di precisione.

  • Formattazione. È possibile convertire un valore Single nella relativa rappresentazione di stringa chiamando il metodo ToString o usando la funzionalità di formattazione composita . Per informazioni su come le stringhe di formato controllano la rappresentazione delle stringhe di valori a virgola mobile, vedere Stringhe di Formato Numerico Standard e Stringhe di Formato Numerico Personalizzato.

  • Analisi delle stringhe. È possibile convertire la rappresentazione di stringa di un valore a virgola mobile in un valore Single chiamando il metodo Parse o TryParse. Se l'operazione di analisi non riesce, il metodo Parse genera un'eccezione, mentre il metodo TryParse restituisce false.

  • Conversione di tipo. La struttura Single fornisce un'implementazione esplicita dell'interfaccia per l'interfaccia IConvertible, che supporta la conversione tra due tipi di dati .NET standard. I compilatori del linguaggio supportano anche la conversione implicita di valori per tutti gli altri tipi numerici standard, ad eccezione della conversione di Double in valori Single. La conversione di un valore di qualsiasi tipo numerico standard diverso da un Double a un Single è una conversione verso un tipo più ampio e non richiede l'uso di un operatore di cast o di un metodo di conversione.

    Tuttavia, la conversione di valori interi a 32 bit e a 64 bit può comportare una perdita di precisione. La tabella seguente elenca le differenze di precisione per i tipi a 32 bit, a 64 bit e Double:

    TIPO Precisione massima (cifre decimali) Precisione interna (cifre decimali)
    Double 15 17
    Int32 e UInt32 10 10
    Int64 e UInt64 19 19
    Single 7 9

    Il problema della precisione influisce più frequentemente sui valori Single convertiti in valori Double. Nell'esempio seguente due valori prodotti da operazioni di divisione identiche non sono uguali, perché uno dei valori è un valore a virgola mobile a precisione singola convertito in un Double.

    Double value1 = 1 / 3.0;
    Single sValue2 = 1 / 3.0f;
    Double value2 = (Double)sValue2;
    Console.WriteLine($"{value1:R} = {value2:R}: {value1.Equals(value2)}");
    
    // The example displays the following output on .NET:
    //        0.3333333333333333 = 0.3333333432674408: False
    
    let value1 = 1. / 3.
    let sValue2 = 1f / 3f
    let value2 = double sValue2
    printfn $"{value1:R} = {value2:R}: {value1.Equals value2}"
    // The example displays the following output:
    //        0.33333333333333331 = 0.3333333432674408: False
    
    Dim value1 As Double = 1 / 3
    Dim sValue2 As Single = 1 / 3
    Dim value2 As Double = CDbl(sValue2)
    Console.WriteLine("{0} = {1}: {2}", value1, value2, value1.Equals(value2))
    
    ' The example displays the following output:
    '       0.3333333333333333 = 0.3333333432674408: False
    

Campi

Nome Descrizione
E

Rappresenta la base logaritmica naturale, specificata dalla costante, e.

Epsilon

Rappresenta il valore positivo Single più piccolo maggiore di zero. Questo campo è costante.

MaxValue

Rappresenta il valore massimo possibile di Single. Questo campo è costante.

MinValue

Rappresenta il valore minimo possibile di Single. Questo campo è costante.

NaN

Rappresenta non un numero (NaN). Questo campo è costante.

NegativeInfinity

Rappresenta l'infinito negativo. Questo campo è costante.

NegativeZero

Rappresenta il numero negativo zero (-0).

Pi

Rappresenta il rapporto tra la circonferenza di un cerchio e il relativo diametro, specificata dalla costante π.

PositiveInfinity

Rappresenta l'infinito positivo. Questo campo è costante.

Tau

Rappresenta il numero di radianti in un turno, specificato dalla costante, τ.

Metodi

Nome Descrizione
Abs(Single)

Calcola l'assoluto di un valore.

Acos(Single)

Calcola l'arco-coseno di un valore.

Acosh(Single)

Calcola l'arco-coseno iperbolico di un valore.

AcosPi(Single)

Calcola l'arco coseno di un valore e divide il risultato per pi.

Asin(Single)

Calcola il seno arco di un valore.

Asinh(Single)

Calcola il seno dell'arco iperbolico di un valore.

AsinPi(Single)

Calcola il seno arco di un valore e divide il risultato per pi.

Atan(Single)

Calcola l'arco-tangente di un valore.

Atan2(Single, Single)

Calcola l'arco tangente del quoziente di due valori.

Atan2Pi(Single, Single)

Calcola l'arco-tangente per il quoziente di due valori e divide il risultato per pi.

Atanh(Single)

Calcola l'arco-tangente iperbolica di un valore.

AtanPi(Single)

Calcola l'arco-tangente di un valore e divide il risultato per pi.

BitDecrement(Single)

Restituisce il valore più grande che confronta meno di un valore specificato.

BitIncrement(Single)

Restituisce il valore più piccolo che confronta un valore maggiore di un valore specificato.

Cbrt(Single)

Calcola la radice del cubo di un valore.

Ceiling(Single)

Calcola il limite massimo di un valore.

Clamp(Single, Single, Single)

Blocca un valore a un valore minimo e massimo inclusivo.

ClampNative(Single, Single, Single)

Blocca un valore a un valore minimo e massimo inclusivo usando un comportamento specifico della piattaforma per NaN e NegativeZero.

CompareTo(Object)

Confronta questa istanza con un oggetto specificato e restituisce un numero intero che indica se il valore di questa istanza è minore, uguale o maggiore del valore dell'oggetto specificato.

CompareTo(Single)

Confronta questa istanza con un numero a virgola mobile e precisione singola specificato e restituisce un intero che indica se il valore di questa istanza è minore, uguale o maggiore del valore del numero a virgola mobile a precisione singola specificato.

ConvertToInteger<TInteger>(Single)

Converte un valore in un tipo integer specificato utilizzando la saturazione in caso di overflow

ConvertToIntegerNative<TInteger>(Single)

Converte un valore in un tipo integer specificato utilizzando un comportamento specifico della piattaforma in caso di overflow.

CopySign(Single, Single)

Copia il segno di un valore nel segno di un altro valore.

Cos(Single)

Calcola il coseno di un valore.

Cosh(Single)

Calcola il coseno iperbolico di un valore.

CosPi(Single)

Calcola il coseno di un valore che è stato multiplo da pi.

CreateChecked<TOther>(TOther)

Crea un'istanza del tipo corrente da un valore, generando un'eccezione di overflow per tutti i valori che non rientrano nell'intervallo rappresentabile del tipo corrente.

CreateSaturating<TOther>(TOther)

Crea un'istanza del tipo corrente da un valore, saturando tutti i valori che non rientrano nell'intervallo rappresentabile del tipo corrente.

CreateTruncating<TOther>(TOther)

Crea un'istanza del tipo corrente da un valore, troncando tutti i valori che non rientrano nell'intervallo rappresentabile del tipo corrente.

DegreesToRadians(Single)

Converte un valore specificato da gradi a radianti.

Equals(Object)

Restituisce un valore che indica se questa istanza è uguale a un oggetto specificato.

Equals(Single)

Restituisce un valore che indica se questa istanza e un oggetto specificato Single rappresentano lo stesso valore.

Exp(Single)

E Calcola una determinata potenza.

Exp10(Single)

10 Calcola una determinata potenza.

Exp10M1(Single)

10 Calcola una determinata potenza e ne sottrae uno.

Exp2(Single)

2 Calcola una determinata potenza.

Exp2M1(Single)

2 Calcola una determinata potenza e ne sottrae uno.

ExpM1(Single)

E Calcola una determinata potenza e ne sottrae uno.

Floor(Single)

Calcola il piano di un valore.

FusedMultiplyAdd(Single, Single, Single)

Calcola il moltiplicatore fuso di tre valori.

GetHashCode()

Restituisce il codice hash per questa istanza.

GetTypeCode()

Restituisce l'oggetto per il TypeCode tipo di Singlevalore .

Hypot(Single, Single)

Calcola l'ipotenusa data due valori che rappresentano le lunghezze dei lati più corti in un triangolo con angolo destro.

Ieee754Remainder(Single, Single)

Calcola il resto di due valori come specificato da IEEE 754.

ILogB(Single)

Calcola il logaritmo intero di un valore.

IsEvenInteger(Single)

Determina se un valore rappresenta un numero integrale pari.

IsFinite(Single)

Determina se il valore specificato è finito (zero, sottonorma o normale).

IsInfinity(Single)

Restituisce un valore che indica se il numero specificato restituisce un infinito negativo o positivo.

IsInteger(Single)

Determina se un valore rappresenta un valore integrale.

IsNaN(Single)

Restituisce un valore che indica se il valore specificato non è un numero (NaN).

IsNegative(Single)

Determina se il valore specificato è negativo.

IsNegativeInfinity(Single)

Restituisce un valore che indica se il numero specificato restituisce un infinito negativo.

IsNormal(Single)

Determina se il valore specificato è normale.

IsOddInteger(Single)

Determina se un valore rappresenta un numero integrale dispari.

IsPositive(Single)

Determina se un valore è positivo.

IsPositiveInfinity(Single)

Restituisce un valore che indica se il numero specificato restituisce un infinito positivo.

IsPow2(Single)

Determina se un valore è una potenza di due.

IsRealNumber(Single)

Determina se un valore rappresenta un numero reale.

IsSubnormal(Single)

Determina se il valore specificato è sottonormaale.

Lerp(Single, Single, Single)

Esegue un'interpolazione lineare tra due valori in base al peso specificato.

Log(Single, Single)

Calcola il logaritmo di un valore nella base specificata.

Log(Single)

Calcola il logaritmo naturalebase-E di un valore.

Log10(Single)

Calcola il logaritmo di base 10 di un valore.

Log10P1(Single)

Calcola il logaritmo in base 10 di un valore più uno.

Log2(Single)

Calcola il log2 di un valore.

Log2P1(Single)

Calcola il logaritmo in base 2 di un valore più uno.

LogP1(Single)

Calcola il logaritmo naturale (base-E) di un valore più uno.

Max(Single, Single)

Confronta due valori con il calcolo maggiore.

MaxMagnitude(Single, Single)

Confronta due valori con il calcolo maggiore.

MaxMagnitudeNumber(Single, Single)

Confronta due valori con il calcolo con la grandezza maggiore e restituendo l'altro valore se un input è NaN.

MaxNative(Single, Single)

Confronta due valori con il calcolo, maggiore è l'uso del comportamento specifico della piattaforma per NaN e NegativeZero.

MaxNumber(Single, Single)

Confronta due valori con il calcolo maggiore e restituendo l'altro valore se un input è NaN.

Min(Single, Single)

Confronta due valori con il calcolo minore.

MinMagnitude(Single, Single)

Confronta due valori con il calcolo minore.

MinMagnitudeNumber(Single, Single)

Confronta due valori con il calcolo con la grandezza minore e restituendo l'altro valore se un input è NaN.

MinNative(Single, Single)

Confronta due valori con il calcolo che è minore usando il comportamento specifico della piattaforma per NaN e NegativeZero.

MinNumber(Single, Single)

Confronta due valori con il calcolo minore e restituendo l'altro valore se un input è NaN.

MultiplyAddEstimate(Single, Single, Single)

Calcola una stima di (left * right) + . addend

Parse(ReadOnlySpan<Byte>, IFormatProvider)

Analizza un intervallo di caratteri UTF-8 in un valore.

Parse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider)

Analizza un intervallo di caratteri UTF-8 in un valore.

Parse(ReadOnlySpan<Char>, IFormatProvider)

Analizza un intervallo di caratteri in un valore.

Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider)

Converte un intervallo di caratteri che contiene la rappresentazione di stringa di un numero in uno stile specificato e in un formato specifico delle impostazioni cultura nel numero a virgola mobile a precisione singola equivalente.

Parse(String, IFormatProvider)

Converte la rappresentazione di stringa di un numero in un formato specifico delle impostazioni cultura specificato nel relativo numero a virgola mobile e precisione singola equivalente.

Parse(String, NumberStyles, IFormatProvider)

Converte la rappresentazione di stringa di un numero in uno stile specificato e in un formato specifico delle impostazioni cultura nel numero a virgola mobile a precisione singola equivalente.

Parse(String, NumberStyles)

Converte la rappresentazione di stringa di un numero in uno stile specificato nel numero a virgola mobile a precisione singola equivalente.

Parse(String)

Converte la rappresentazione di stringa di un numero nel numero a virgola mobile a precisione singola equivalente.

Pow(Single, Single)

Calcola un valore elevato a una determinata potenza.

RadiansToDegrees(Single)

Converte un determinato valore da radianti a gradi.

ReciprocalEstimate(Single)

Calcola una stima del reciproco di un valore.

ReciprocalSqrtEstimate(Single)

Calcola una stima della radice quadrata reciproca di un valore.

RootN(Single, Int32)

Calcola la radice n-th di un valore.

Round(Single, Int32, MidpointRounding)

Arrotonda un valore a un numero specificato di cifre frazionarie usando la modalità di arrotondamento predefinita (ToEven).

Round(Single, Int32)

Arrotonda un valore a un numero specificato di cifre frazionarie usando la modalità di arrotondamento predefinita (ToEven).

Round(Single, MidpointRounding)

Arrotonda un valore all'intero più vicino utilizzando la modalità di arrotondamento specificata.

Round(Single)

Arrotonda un valore all'intero più vicino usando la modalità di arrotondamento predefinita (ToEven).

ScaleB(Single, Int32)

Calcola il prodotto di un valore e il relativo base-radix elevato alla potenza specificata.

Sign(Single)

Calcola il segno di un valore.

Sin(Single)

Calcola il seno di un valore.

SinCos(Single)

Calcola il seno e il coseno di un valore.

SinCosPi(Single)

Calcola il seno e il coseno di un valore.

Sinh(Single)

Calcola il seno iperbolico di un valore.

SinPi(Single)

Calcola il seno di un valore moltiplicato per pi.

Sqrt(Single)

Calcola la radice quadrata di un valore.

Tan(Single)

Calcola la tangente di un valore.

Tanh(Single)

Calcola la tangente iperbolica di un valore.

TanPi(Single)

Calcola la tangente di un valore che è stato multiplo da pi.

ToString()

Converte il valore numerico di questa istanza nella rappresentazione di stringa equivalente.

ToString(IFormatProvider)

Converte il valore numerico di questa istanza nella rappresentazione di stringa equivalente usando le informazioni sul formato specifiche delle impostazioni cultura specificate.

ToString(String, IFormatProvider)

Converte il valore numerico di questa istanza nella rappresentazione di stringa equivalente utilizzando il formato specificato e le informazioni sul formato specifiche delle impostazioni cultura.

ToString(String)

Converte il valore numerico di questa istanza nella rappresentazione di stringa equivalente utilizzando il formato specificato.

Truncate(Single)

Tronca un valore.

TryFormat(Span<Byte>, Int32, ReadOnlySpan<Char>, IFormatProvider)

Prova a formattare il valore dell'istanza corrente come UTF-8 nell'intervallo di byte specificato.

TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider)

Prova a formattare il valore dell'istanza del numero float corrente nell'intervallo di caratteri specificato.

TryParse(ReadOnlySpan<Byte>, IFormatProvider, Single)

Prova ad analizzare un intervallo di caratteri UTF-8 in un valore.

TryParse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider, Single)

Prova ad analizzare un intervallo di caratteri UTF-8 in un valore.

TryParse(ReadOnlySpan<Byte>, Single)

Prova a convertire un intervallo di caratteri UTF-8 contenente la rappresentazione di stringa di un numero nel numero a virgola mobile a precisione singola equivalente.

TryParse(ReadOnlySpan<Char>, IFormatProvider, Single)

Tenta di analizzare un intervallo di caratteri in un valore.

TryParse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider, Single)

Converte la rappresentazione dell'intervallo di un numero in uno stile specificato e in un formato specifico delle impostazioni cultura nel numero a virgola mobile a precisione singola equivalente. Un valore restituito indica se la conversione ha avuto esito positivo o negativo.

TryParse(ReadOnlySpan<Char>, Single)

Converte la rappresentazione di stringa di un numero in un intervallo di caratteri nel numero a virgola mobile a precisione singola equivalente. Un valore restituito indica se la conversione ha avuto esito positivo o negativo.

TryParse(String, IFormatProvider, Single)

Tenta di analizzare una stringa in un valore.

TryParse(String, NumberStyles, IFormatProvider, Single)

Converte la rappresentazione di stringa di un numero in uno stile specificato e in un formato specifico delle impostazioni cultura nel numero a virgola mobile a precisione singola equivalente. Un valore restituito indica se la conversione ha avuto esito positivo o negativo.

TryParse(String, Single)

Converte la rappresentazione di stringa di un numero nel numero a virgola mobile a precisione singola equivalente. Un valore restituito indica se la conversione ha avuto esito positivo o negativo.

Operatori

Nome Descrizione
Equality(Single, Single)

Restituisce un valore che indica se due valori specificati Single sono uguali.

GreaterThan(Single, Single)

Restituisce un valore che indica se un valore specificato Single è maggiore di un altro valore specificato Single .

GreaterThanOrEqual(Single, Single)

Restituisce un valore che indica se un valore specificato Single è maggiore o uguale a un altro valore specificato Single .

Inequality(Single, Single)

Restituisce un valore che indica se due valori specificati Single non sono uguali.

LessThan(Single, Single)

Restituisce un valore che indica se un valore specificato Single è minore di un altro valore specificato Single .

LessThanOrEqual(Single, Single)

Restituisce un valore che indica se un valore specificato Single è minore o uguale a un altro valore specificato Single .

Implementazioni dell'interfaccia esplicita

Nome Descrizione
IAdditionOperators<Single,Single,Single>.Addition(Single, Single)

Aggiunge due valori insieme per calcolare la somma.

IAdditiveIdentity<Single,Single>.AdditiveIdentity

Ottiene l'identità aggiuntiva del tipo corrente.

IBinaryNumber<Single>.AllBitsSet

Ottiene un'istanza del tipo binario in cui vengono impostati tutti i bit.

IBitwiseOperators<Single,Single,Single>.BitwiseAnd(Single, Single)

Calcola i valori bit per bit e di due valori.

IBitwiseOperators<Single,Single,Single>.BitwiseOr(Single, Single)

Calcola i valori bit per bit o di due valori.

IBitwiseOperators<Single,Single,Single>.ExclusiveOr(Single, Single)

Calcola il valore esclusivo o di due valori.

IBitwiseOperators<Single,Single,Single>.OnesComplement(Single)

Calcola la rappresentazione di complemento di un determinato valore.

IComparable.CompareTo(Object)

Confronta l'istanza corrente con un altro oggetto dello stesso tipo e restituisce un numero intero che indica se l'istanza corrente precede, segue o si trova nella stessa posizione nell'ordinamento dell'altro oggetto.

IConvertible.GetTypeCode()

Restituisce l'oggetto TypeCode per questa istanza.

IConvertible.ToBoolean(IFormatProvider)

Per una descrizione di questo membro, vedere ToBoolean(IFormatProvider).

IConvertible.ToByte(IFormatProvider)

Per una descrizione di questo membro, vedere ToByte(IFormatProvider).

IConvertible.ToChar(IFormatProvider)

Questa conversione non è supportata. Il tentativo di utilizzare questo metodo genera un'eccezione InvalidCastException.

IConvertible.ToDateTime(IFormatProvider)

Questa conversione non è supportata. Il tentativo di utilizzare questo metodo genera un'eccezione InvalidCastException.

IConvertible.ToDecimal(IFormatProvider)

Per una descrizione di questo membro, vedere ToDecimal(IFormatProvider).

IConvertible.ToDouble(IFormatProvider)

Per una descrizione di questo membro, vedere ToDouble(IFormatProvider).

IConvertible.ToInt16(IFormatProvider)

Per una descrizione di questo membro, vedere ToInt16(IFormatProvider).

IConvertible.ToInt32(IFormatProvider)

Per una descrizione di questo membro, vedere ToInt32(IFormatProvider).

IConvertible.ToInt64(IFormatProvider)

Per una descrizione di questo membro, vedere ToInt64(IFormatProvider).

IConvertible.ToSByte(IFormatProvider)

Per una descrizione di questo membro, vedere ToSByte(IFormatProvider).

IConvertible.ToSingle(IFormatProvider)

Per una descrizione di questo membro, vedere ToSingle(IFormatProvider).

IConvertible.ToType(Type, IFormatProvider)

Per una descrizione di questo membro, vedere ToType(Type, IFormatProvider).

IConvertible.ToUInt16(IFormatProvider)

Per una descrizione di questo membro, vedere ToUInt16(IFormatProvider).

IConvertible.ToUInt32(IFormatProvider)

Per una descrizione di questo membro, vedere ToUInt32(IFormatProvider).

IConvertible.ToUInt64(IFormatProvider)

Per una descrizione di questo membro, vedere ToUInt64(IFormatProvider).

IDecrementOperators<Single>.Decrement(Single)

Decrementa un valore.

IDivisionOperators<Single,Single,Single>.Division(Single, Single)

Divide un valore per un altro per calcolare il quoziente.

IFloatingPoint<Single>.GetExponentByteCount()

Ottiene il numero di byte che verranno scritti come parte di TryWriteExponentLittleEndian(Span<Byte>, Int32).

IFloatingPoint<Single>.GetExponentShortestBitLength()

Ottiene la lunghezza, espressa in bit, della rappresentazione di complemento più breve dell'esponente corrente.

IFloatingPoint<Single>.GetSignificandBitLength()

Ottiene la lunghezza, espressa in bit, del significando corrente.

IFloatingPoint<Single>.GetSignificandByteCount()

Ottiene il numero di byte che verranno scritti come parte di TryWriteSignificandLittleEndian(Span<Byte>, Int32).

IFloatingPoint<Single>.TryWriteExponentBigEndian(Span<Byte>, Int32)

Prova a scrivere l'esponente corrente, in formato big-endian, in un determinato intervallo.

IFloatingPoint<Single>.TryWriteExponentLittleEndian(Span<Byte>, Int32)

Prova a scrivere l'esponente corrente, in formato little-endian, in un intervallo specificato.

IFloatingPoint<Single>.TryWriteSignificandBigEndian(Span<Byte>, Int32)

Prova a scrivere il significando corrente, in formato big-endian, in un intervallo specificato.

IFloatingPoint<Single>.TryWriteSignificandLittleEndian(Span<Byte>, Int32)

Prova a scrivere il significando corrente, in formato little-endian, in un intervallo specificato.

IFloatingPointConstants<Single>.E

Ottiene la costante ematematica .

IFloatingPointConstants<Single>.Pi

Ottiene la costante pimatematica .

IFloatingPointConstants<Single>.Tau

Ottiene la costante taumatematica .

IFloatingPointIeee754<Single>.Epsilon

Ottiene il valore più piccolo che può essere aggiunto a 0 che non comporta 0.

IFloatingPointIeee754<Single>.NaN

Ottiene un valore che rappresenta NaN.

IFloatingPointIeee754<Single>.NegativeInfinity

Ottiene un valore che rappresenta un valore negativo infinity.

IFloatingPointIeee754<Single>.NegativeZero

Ottiene un valore che rappresenta un valore negativo zero.

IFloatingPointIeee754<Single>.PositiveInfinity

Ottiene un valore che rappresenta un valore positivo infinity.

IIncrementOperators<Single>.Increment(Single)

Incrementa un valore.

IMinMaxValue<Single>.MaxValue

Ottiene il valore massimo del tipo corrente.

IMinMaxValue<Single>.MinValue

Ottiene il valore minimo del tipo corrente.

IModulusOperators<Single,Single,Single>.Modulus(Single, Single)

Divide due valori insieme per calcolare il modulo o il resto.

IMultiplicativeIdentity<Single,Single>.MultiplicativeIdentity

Ottiene l'identità moltiplicativa del tipo corrente.

IMultiplyOperators<Single,Single,Single>.Multiply(Single, Single)

Moltiplica due valori insieme per calcolare il prodotto.

INumberBase<Single>.IsCanonical(Single)

Determina se un valore è nella relativa rappresentazione canonica.

INumberBase<Single>.IsComplexNumber(Single)

Determina se un valore rappresenta un numero complesso.

INumberBase<Single>.IsImaginaryNumber(Single)

Determina se un valore rappresenta un numero immaginario puro.

INumberBase<Single>.IsZero(Single)

Determina se un valore è zero.

INumberBase<Single>.One

Ottiene il valore 1 per il tipo.

INumberBase<Single>.Radix

Ottiene la radice o la base del tipo.

INumberBase<Single>.TryConvertFromChecked<TOther>(TOther, Single)

Rappresenta un numero a virgola mobile a precisione singola.

INumberBase<Single>.TryConvertFromSaturating<TOther>(TOther, Single)

Rappresenta un numero a virgola mobile a precisione singola.

INumberBase<Single>.TryConvertFromTruncating<TOther>(TOther, Single)

Rappresenta un numero a virgola mobile a precisione singola.

INumberBase<Single>.TryConvertToChecked<TOther>(Single, TOther)

Tenta di convertire un'istanza del tipo corrente in un altro tipo, generando un'eccezione di overflow per tutti i valori che non rientrano nell'intervallo rappresentabile del tipo corrente.

INumberBase<Single>.TryConvertToSaturating<TOther>(Single, TOther)

Tenta di convertire un'istanza del tipo corrente in un altro tipo, saturando tutti i valori che non rientrano nell'intervallo rappresentabile del tipo corrente.

INumberBase<Single>.TryConvertToTruncating<TOther>(Single, TOther)

Tenta di convertire un'istanza del tipo corrente in un altro tipo, troncando tutti i valori che non rientrano nell'intervallo rappresentabile del tipo corrente.

INumberBase<Single>.Zero

Ottiene il valore 0 per il tipo.

ISignedNumber<Single>.NegativeOne

Ottiene il valore -1 per il tipo.

ISubtractionOperators<Single,Single,Single>.Subtraction(Single, Single)

Sottrae due valori per calcolare la differenza.

IUnaryNegationOperators<Single,Single>.UnaryNegation(Single)

Calcola la negazione unaria di un valore.

IUnaryPlusOperators<Single,Single>.UnaryPlus(Single)

Calcola il plus unario di un valore.

Si applica a

Thread safety

Tutti i membri di questo tipo sono thread-safe. I membri che sembrano modificare lo stato dell'istanza restituiscono effettivamente una nuova istanza inizializzata con il nuovo valore. Come per qualsiasi altro tipo, la lettura e la scrittura in una variabile condivisa contenente un'istanza di questo tipo devono essere protette da un blocco per garantire la thread safety.

Vedi anche