Single Struct-datatyp

Definition

Representerar en flyttalstyp med enkel precision.

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
Arv
Single
Attribut
Implementeringar
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>

Kommentarer

Värdetypen Single representerar ett 32-bitars tal med enkel precision med värden som sträcker sig från negativa 3,402823e38 till positiva 3,402823e38, samt positiv eller negativ noll, PositiveInfinity, NegativeInfinityoch inte ett tal (NaN). Det är avsett att representera värden som är extremt stora (till exempel avstånd mellan planeter eller galaxer) eller extremt små (till exempel molekylmassan hos ett ämne i kg) och som ofta är oprecisa (till exempel avståndet från jorden till ett annat solsystem). Den Single-typen uppfyller IEC 60559:1989-standarden (IEEE 754) för binär flyttalsaritmetik.

System.Single innehåller metoder för att jämföra instanser av den här typen, konvertera värdet för en instans till dess strängrepresentation och konvertera strängrepresentationen av ett tal till en instans av den här typen. Information om hur formatspecifikationskoder styr strängrepresentationen av värdetyper finns i Formateringstyper, Standard numeriska formatsträngar och Anpassade numeriska formatsträngar.

Flyttalsrepresentation och precision

Datatypen Single lagrar flyttalsvärden med enkel precision i ett 32-bitars binärt format, enligt följande tabell:

Del Bitar
Signifikand eller mantissa 0-22
Exponent 23-30
Tecken (0 = positivt, 1 = negativt) 31

Precis som decimaltal inte exakt kan representera vissa bråkvärden (till exempel 1/3 eller #B0) kan binära bråk inte representera vissa bråkvärden. Till exempel representeras 2/10, som exakt representeras av .2 som ett decimaltal, av .0011111001001100 som en binär fraktion, där mönstret "1100" upprepas till oändligheten. I det här fallet ger flyttalsvärdet en oprecis representation av det tal som det representerar. Att utföra ytterligare matematiska åtgärder på det ursprungliga flyttalsvärdet ökar ofta dess brist på precision. Om du till exempel jämför resultatet av att multiplicera .3 med 10 och lägga till .3 till .3 nio gånger ser du att tillägget ger det mindre exakta resultatet, eftersom det omfattar åtta fler åtgärder än multiplikation. Observera att den här skillnaden endast är uppenbar om du visar de två Single värdena med hjälp av standardsträngen "R" i numeriskt format, som vid behov visar alla 9 precisionssiffror som stöds av Single typen.

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

Eftersom vissa tal inte kan representeras exakt som binära bråkvärden kan flyttalsnummer endast ungefärliga reala tal.

Alla flyttalsnummer har ett begränsat antal signifikanta siffror, vilket också avgör hur exakt ett flyttalsvärde ungefärliger ett verkligt tal. Ett Single värde har upp till 7 decimaler med precision, även om högst 9 siffror bibehålls internt. Det innebär att vissa flyttalsoperationer kan sakna precision för att påverka ett flyttalsvärde. I följande exempel definieras ett stort flyttalsvärde med enkel precision och sedan läggs produkten av Single.Epsilon och en kvadrillion till den. Produkten är dock för liten för att kunna ändra det ursprungliga flyttalsvärdet. Den minst signifikanta siffran är tusendelar, medan den viktigaste siffran i produkten är 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

Den begränsade precisionen för ett flyttalsnummer har flera konsekvenser:

  • Två flyttalsnummer som verkar lika med en viss precision kanske inte jämförs lika med eftersom deras minst signifikanta siffror skiljer sig åt. I följande exempel läggs en serie tal ihop och deras totalsumma jämförs med den förväntade summan. Ett anrop till Equals metoden anger att värdena inte är lika med.

    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).
    

    De två värdena är olika på grund av en förlust av precision under tilläggsåtgärderna. I det här fallet kan problemet lösas genom att anropa Math.Round(Double, Int32) metoden för att avrunda Single värdena till önskad precision innan jämförelsen utförs.

  • En matematisk åtgärd eller jämförelseåtgärd som använder ett flyttalsnummer kanske inte ger samma resultat om ett decimaltal används, eftersom det binära flyttalsnumret kanske inte är lika med decimaltalet. Ett tidigare exempel illustrerade detta genom att visa resultatet av att multiplicera .3 med 10 och lägga till .3 till .3 nio gånger.

    När noggrannhet i numeriska åtgärder med bråkvärden är viktigt använder du Decimal typen i stället för typen Single . När noggrannhet i numeriska operationer med integralvärden utanför intervallet för typerna Int64 eller UInt64 är viktigt, använd typen BigInteger.

  • Single värden har mindre precision än Double värden. Ett Single värde som konverteras till en till synes ekvivalent DoubleDouble är ofta inte lika med värdet på grund av skillnader i precision. I följande exempel tilldelas resultatet av identiska divisionsåtgärder till ett Double värde och ett Single värde. När värdet i Single har omvandlats till en Double, visar en jämförelse av de två värdena att de är olika.

    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
    

    Undvik det här problemet genom att antingen använda Double datatypen i stället för Single datatypen eller använda Round metoden så att båda värdena har samma precision.

Test för likhet

För att betraktas som lika måste två Single värden representera identiska värden. Men på grund av skillnader i precision mellan värden, eller på grund av en förlust av precision med ett eller båda värdena, visar sig flyttalsvärden som förväntas vara identiska ofta vara ojämlika på grund av skillnader i deras minst signifikanta siffror. Därför innebär anrop till Equals-metoden för att avgöra om två värden är lika, eller anrop till CompareTo-metoden för att fastställa relationen mellan två Single-värden, ofta oväntade resultat. Detta är tydligt i följande exempel, där två till synes lika Single värden visar sig vara ojämlika, eftersom det första värdet har 7 siffror precision, medan det andra värdet har 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

Beräknade värden som följer olika kodsökvägar och som manipuleras på olika sätt visar sig ofta vara ojämlika. I följande exempel upphöjs ett Single värde till två och sedan beräknas kvadratroten för att återställa det ursprungliga värdet. En andra Single multipliceras med 3,51 och kvadreras innan kvadratroten av resultatet divideras med 3,51 för att återställa det ursprungliga värdet. Även om de två värdena verkar vara identiska anger ett anrop till Equals(Single)-metoden att de inte är lika.

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

I de fall där en förlust av precision sannolikt kommer att påverka resultatet av en jämförelse kan du använda följande tekniker i stället för att anropa Equals metoden eller CompareTo :

  • Anropa Math.Round-metoden för att säkerställa att båda värdena har samma noggrannhet. I följande exempel ändras ett tidigare exempel för att använda den här metoden så att två bråkvärden är likvärdiga.

    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
    

    Problemet med precision gäller fortfarande för avrundning av mittpunktsvärden. Mer information finns i Math.Round(Double, Int32, MidpointRounding)-metoden.

  • Testa för ungefärlig likhet i stället för likhet. Den här tekniken kräver att du antingen definierar en absolut mängd med vilken de två värdena kan skilja sig men fortfarande vara lika med, eller att du definierar en relativ mängd med vilken det mindre värdet kan avvika från det större värdet.

    Varning

    Single.Epsilon används ibland som ett absolut mått på avståndet mellan två Single värden vid likhetstestning. Dock mäter Single.Epsilon det minsta möjliga värde som kan läggas till en Single, eller subtraheras från en Single, vars värde är noll. För de flesta positiva och negativa Single värden är värdet Single.Epsilon för för litet för att identifieras. Med undantag för värden som är noll rekommenderar vi därför inte att det används i tester för likhet.

    I följande exempel används den senare metoden för att definiera en IsApproximatelyEqual-metod som testar den relativa skillnaden mellan två värden. Det kontrasterar också resultatet av anrop till IsApproximatelyEqual metoden och Equals(Single) metoden.

    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
    

Flyttalsvärden och undantag

Åtgärder med flyttalsvärden utlöser inte undantag, till skillnad från åtgärder med integrerade typer, som utlöser undantag i fall av olagliga åtgärder som division med noll eller spill. I dessa situationer är resultatet av en flyttalsåtgärd i stället noll, positiv oändlighet, negativ oändlighet eller inte ett tal (NaN):

  • Om resultatet av en flyttalsåtgärd är för litet för målformatet blir resultatet noll. Detta kan inträffa när två mycket små flyttalsnummer multipliceras, vilket visas i följande exempel.

    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
    
  • Om storleken på resultatet av en flyttalsåtgärd överskrider målformatets intervall är PositiveInfinity resultatet av åtgärden eller NegativeInfinity, beroende på resultatets tecken. Resultatet av en operation som spiller över Single.MaxValue är PositiveInfinity, och resultatet av en operation som spiller över Single.MinValue är NegativeInfinity, som visas i följande exempel.

    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 resultat från en division med noll med en positiv utdelning och NegativeInfinity resultat från en division med noll med negativ utdelning.

  • Om en flyttalsoperation är ogiltig är resultatet av operationen NaN. Till exempel NaN resulterar från följande operationer:

    • Division med noll med en utdelning på noll. Observera att andra divisionsfall med noll resulterar i antingen PositiveInfinity eller NegativeInfinity.
    • Alla flyttalsoperationer med ogiltiga värden. Om du till exempel försöker hitta kvadratroten för ett negativt värde returneras NaN.
    • Alla åtgärder med ett argument vars värde är Single.NaN.

Typkonverteringar

Den Single strukturen definierar inte några explicita eller implicita konverteringsoperatorer. I stället implementeras konverteringar av kompilatorn.

I följande tabell visas möjliga konverteringar av ett värde för de andra primitiva numeriska typerna till ett Single värde. Den anger också om konverteringen breddar eller minskar och om resultatet Single kan ha mindre precision än det ursprungliga värdet.

Konvertering från Breddning/förträngning Möjlig förlust av precision
Byte Breddning No
Decimal Breddning

Observera att C# kräver en cast-operator.
Yes. Decimal stöder 29 decimaler med precision. Single stöder 9.
Double Förträngning; värden utanför tillåtna gränser konverteras till Double.NegativeInfinity eller Double.PositiveInfinity. Yes. Double stöder 17 decimaler med precision. Single stöder 9.
Int16 Breddning No
Int32 Breddning Yes. Int32 stöder 10 decimaltal med precision. Single stöder 9.
Int64 Breddning Yes. Int64 stöder 19 decimaltal med precision. Single stöder 9.
SByte Breddning No
UInt16 Breddning No
UInt32 Breddning Yes. UInt32 stöder 10 decimaltal med precision. Single stöder 9.
UInt64 Breddning Yes. Int64 stöder 20 decimaltal med precision. Single stöder 9.

I följande exempel konverteras det lägsta eller högsta värdet för andra primitiva numeriska typer till ett Single värde.

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)

Dessutom konverteras Double värdena Double.NaN, Double.PositiveInfinity och Double.NegativeInfinity till Single.NaN, Single.PositiveInfinity och Single.NegativeInfinity.

Observera att konverteringen av värdet för vissa numeriska typer till ett Single värde kan innebära en förlust av precision. Som exemplet visar är en förlust av precision möjlig när du konverterar Decimal, Double, Int32, Int64, UInt32och UInt64 värden till Single värden.

Konverteringen av ett Single värde till en Double är en bredare konvertering. Konverteringen kan leda till en precisionsförlust om Double typen inte har en exakt representation av Single värdet.

Konverteringen av ett Single värde till ett värde av någon annan primitiv numerisk datatyp än en Double är en begränsad konvertering och kräver en cast-operator (i C#) eller en konverteringsmetod (i Visual Basic). Värden som ligger utanför intervallet för måldatatypen, som definieras av måltypens MinValue och MaxValue egenskaperna, fungerar som det visas i följande tabell.

Måltyp Result
Alla typer av integraler Ett OverflowException undantag om konverteringen sker i ett kontrollerat sammanhang.

Om konverteringen sker i en omarkerad kontext (standardvärdet i C#) lyckas konverteringsåtgärden men värdet flödar över.
Decimal Ett OverflowException undantag.

Dessutom Single.NaN, Single.PositiveInfinity och Single.NegativeInfinity kastar ett OverflowException för konverteringar till heltal i en kontrollerad miljö, men dessa värden flödar över när de konverteras till heltal i en obegränsad miljö. För konverteringar till Decimal kastar de alltid en OverflowException. För konverteringar till Doublekonverteras de till Double.NaN, Double.PositiveInfinityrespektive Double.NegativeInfinity.

Observera att en förlust av precision kan bero på att ett värde konverteras till en Single annan numerisk typ. Om du konverterar icke-integralvärden Single , som utdata från exemplet visar, går bråkkomponenten förlorad när Single värdet antingen avrundas (som i Visual Basic) eller trunkeras (som i C# och F#). För konverteringar till Decimal värden Single kanske värdet inte har någon exakt representation i måldatatypen.

I följande exempel konverteras några Single värden till flera andra numeriska typer. Konverteringarna sker i en markerad kontext i Visual Basic (standard), i C# (på grund av det markerade nyckelordet) och i F# (på grund av -instruktionen open Checked ). Utdata från exemplet visar resultatet för konverteringar i både en markerad och omarkerad kontext. Du kan utföra konverteringar i en omarkerad kontext i Visual Basic genom att kompilera med /removeintchecks+ kompilatorväxeln, i C# genom att kommentera ut -instruktionen checked och i F# genom att kommentera ut -instruktionen 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)

Mer information om konvertering av numeriska typer finns i Type Conversion in .NET och Type Conversion Tables.

Flyttalsfunktionalitet

Strukturen Single och relaterade typer tillhandahåller metoder för att utföra följande åtgärdskategorier:

  • Jämförelse av värden. Du kan anropa Equals metoden för att avgöra om två Single värden är lika med eller CompareTo metoden för att fastställa relationen mellan två värden.

    Den Single-strukturen stöder också en fullständig uppsättning jämförelseoperatorer. Du kan till exempel testa för likhet eller ojämlikhet, eller avgöra om ett värde är större än eller lika med ett annat värde. Om en av operanderna är en DoubleSingle konverteras värdet till en Double innan jämförelsen utförs. Om en av operanderna är en integrerad typ konverteras den till en Single innan jämförelsen utförs. Även om dessa är bredare konverteringar kan de innebära en förlust av precision.

    Varning

    På grund av skillnader i precision kan två Single värden som du förväntar dig vara lika med visa sig vara ojämlika, vilket påverkar resultatet av jämförelsen. Mer information om hur du jämför två värden finns i avsnittet Single.

    Du kan också anropa IsNaNmetoderna , IsInfinity, IsPositiveInfinityoch IsNegativeInfinity för att testa dessa specialvärden.

  • Matematiska operationer. Vanliga aritmetiska åtgärder som addition, subtraktion, multiplikation och division implementeras av språkkompilatorer och CIL-instruktioner (Common Intermediate Language) snarare än med Single metoder. Om den andra operanden i en matematisk åtgärd är en Doublekonverteras den Single till en Double innan åtgärden utförs, och resultatet av åtgärden är också ett Double värde. Om den andra operanden är en integrerad typ konverteras den till en Single innan åtgärden utförs, och resultatet av åtgärden är också ett Single värde.

    Du kan utföra andra matematiska åtgärder genom att anropa static (Shared i Visual Basic)-metoder i System.Math klassen. Dessa inkluderar ytterligare metoder som ofta används för aritmetik (till exempel , och Math.Abs), geometri (till exempel Math.Sign och Math.Sqrt) och kalkyl (till exempel Math.Cos). Math.SinMath.Log I samtliga fall konverteras det Single värdet till en Double.

    Du kan också hantera de enskilda bitarna i ett Single värde. BitConverter.GetBytes(Single)-metoden returnerar sitt bitmönster i en bytearray. Genom att skicka bytematrisen BitConverter.ToInt32 till metoden kan du också bevara Single värdets bitmönster i ett 32-bitars heltal.

  • Avrundning. Avrundning används ofta som en teknik för att minska effekten av skillnader mellan värden som orsakas av problem med flyttalsrepresentation och precision. Du kan avrunda ett Single värde genom att Math.Round anropa metoden. Observera dock att Single värdet konverteras till en Double innan metoden anropas, och konverteringen kan innebära en förlust av precision.

  • B0 formatering A1 Du kan konvertera ett Single värde till dess strängrepresentation genom att anropa ToString metoden eller med hjälp av funktionen för sammansatt formatering . Information om hur formatsträngar styr strängrepresentationen av flyttalsvärden finns i Standard numeriska formatsträngar och Anpassade numeriska formatsträngar.

  • Parsning av strängar. Du kan konvertera strängrepresentationen av ett flyttalsvärde till ett Single värde genom att anropa Parse metoden eller TryParse . Om parsningsåtgärden Parse misslyckas utlöser metoden ett undantag, medan TryParse metoden returnerar false.

  • Typkonvertering. Strukturen Single tillhandahåller en explicit gränssnittsimplementering för IConvertible gränssnittet, som stöder konvertering mellan två standarddatatyper för .NET. Språkkompilatorer stöder också implicit konvertering av värden för alla andra numeriska standardtyper förutom konvertering av Double till Single värden. Konvertering av ett värde av någon annan standardtyp än en Double till en Single är en bredare konvertering och kräver inte användning av en gjutningsoperator eller konverteringsmetod.

    Konvertering av 32-bitars- och 64-bitars heltalsvärden kan dock innebära en förlust av precision. I följande tabell visas skillnaderna i precision för 32-bitars, 64-bitars och Double typer:

    Type Maximal precision (decimaler) Intern precision (decimalplatser)
    Double 15 17
    Int32 och UInt32 10 10
    Int64 och UInt64 19 19
    Single 7 9

    Problemet med precision påverkar oftast Single-värden som konverteras till Double-värden. I följande exempel är två värden som genereras av identiska divisionsåtgärder ojämlika, eftersom ett av värdena är ett flyttal med enkel precision som konverteras till en 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
    

Fält

Name Description
E

Representerar den naturliga logaritmiska basen, som anges av konstanten, e.

Epsilon

Representerar det minsta positiva Single värdet som är större än noll. Det här fältet är konstant.

MaxValue

Representerar det största möjliga värdet för Single. Det här fältet är konstant.

MinValue

Representerar det minsta möjliga värdet för Single. Det här fältet är konstant.

NaN

Representerar inte ett tal (NaN). Det här fältet är konstant.

NegativeInfinity

Representerar negativ oändlighet. Det här fältet är konstant.

NegativeZero

Representerar talets negativa nolla (-0).

Pi

Representerar förhållandet mellan en cirkels omkrets och dess diameter, som anges av konstanten, π.

PositiveInfinity

Representerar positiv oändlighet. Det här fältet är konstant.

Tau

Representerar antalet radianer i en tur, som anges av konstanten, τ.

Metoder

Name Description
Abs(Single)

Beräknar det absoluta värdet.

Acos(Single)

Beräknar arc-cosinus för ett värde.

Acosh(Single)

Beräknar hyperbolisk arc-cosinus för ett värde.

AcosPi(Single)

Beräknar arc-cosinus för ett värde och delar resultatet pimed .

Asin(Single)

Beräknar arc-sinus för ett värde.

Asinh(Single)

Beräknar hyperbolisk arc-sinus för ett värde.

AsinPi(Single)

Beräknar arc-sinus för ett värde och delar resultatet pimed .

Atan(Single)

Beräknar arc-tangenten för ett värde.

Atan2(Single, Single)

Beräknar arc-tangenten för kvoten för två värden.

Atan2Pi(Single, Single)

Beräknar arc-tangenten för kvoten för två värden och delar resultatet pimed .

Atanh(Single)

Beräknar hyperbolisk arc-tangens för ett värde.

AtanPi(Single)

Beräknar arc-tangenten för ett värde och delar resultatet med pi.

BitDecrement(Single)

Returnerar det största värdet som jämför mindre än ett angivet värde.

BitIncrement(Single)

Returnerar det minsta värde som jämför större än ett angivet värde.

Cbrt(Single)

Beräknar kubroten för ett värde.

Ceiling(Single)

Beräknar taket för ett värde.

Clamp(Single, Single, Single)

Klämmer fast ett värde till ett inkluderande lägsta och högsta värde.

ClampNative(Single, Single, Single)

Klämmer fast ett värde till ett inkluderande lägsta och högsta värde med hjälp av plattformsspecifikt beteende för NaN och NegativeZero.

CompareTo(Object)

Jämför den här instansen med ett angivet objekt och returnerar ett heltal som anger om värdet för den här instansen är mindre än, lika med eller större än värdet för det angivna objektet.

CompareTo(Single)

Jämför den här instansen med ett angivet flyttal med enkel precision och returnerar ett heltal som anger om värdet för den här instansen är mindre än, lika med eller större än värdet för det angivna flyttalsnumret med enkel precision.

ConvertToInteger<TInteger>(Single)

Konverterar ett värde till en angiven heltalstyp med mättnad vid spill

ConvertToIntegerNative<TInteger>(Single)

Konverterar ett värde till en angiven heltalstyp med plattformsspecifikt beteende vid spill.

CopySign(Single, Single)

Kopierar tecknet för ett värde till tecknet för ett annat värde.

Cos(Single)

Beräknar cosininen för ett värde.

Cosh(Single)

Beräknar hyperbolisk cosiné för ett värde.

CosPi(Single)

Beräknar cosininen för ett värde som har multiplats av pi.

CreateChecked<TOther>(TOther)

Skapar en instans av den aktuella typen från ett värde, vilket utlöser ett spill-undantag för värden som ligger utanför det representerarbara intervallet för den aktuella typen.

CreateSaturating<TOther>(TOther)

Skapar en instans av den aktuella typen från ett värde som mättar alla värden som ligger utanför det representerarbara intervallet för den aktuella typen.

CreateTruncating<TOther>(TOther)

Skapar en instans av den aktuella typen från ett värde och trunkerar alla värden som ligger utanför det representerarbara intervallet för den aktuella typen.

DegreesToRadians(Single)

Konverterar ett givet värde från grader till radianer.

Equals(Object)

Returnerar ett värde som anger om den här instansen är lika med ett angivet objekt.

Equals(Single)

Returnerar ett värde som anger om den här instansen och ett angivet Single objekt representerar samma värde.

Exp(Single)

Beräkningar som har genererats E till en viss effekt.

Exp10(Single)

Beräkningar som har genererats 10 till en viss effekt.

Exp10M1(Single)

Beräkningar som genereras 10 till en viss effekt och subtraherar en.

Exp2(Single)

Beräkningar som har genererats 2 till en viss effekt.

Exp2M1(Single)

Beräkningar som genereras 2 till en viss effekt och subtraherar en.

ExpM1(Single)

Beräkningar som genereras E till en viss effekt och subtraherar en.

Floor(Single)

Beräknar golvet i ett värde.

FusedMultiplyAdd(Single, Single, Single)

Beräknar det sammansvetsade multiplikationstillägget med tre värden.

GetHashCode()

Returnerar hash-koden för den här instansen.

GetTypeCode()

TypeCode Returnerar för värdetypen Single.

Hypot(Single, Single)

Beräknar hypotenuse med två värden som representerar längden på de kortare sidorna i en högervinklad triangel.

Ieee754Remainder(Single, Single)

Beräknar resten av två värden enligt IEEE 754.

ILogB(Single)

Beräknar heltalsloggaritmen för ett värde.

IsEvenInteger(Single)

Avgör om ett värde representerar ett jämnt heltal.

IsFinite(Single)

Avgör om det angivna värdet är begränsat (noll, subnormalt eller normalt).

IsInfinity(Single)

Returnerar ett värde som anger om det angivna talet utvärderas till negativ eller positiv oändlighet.

IsInteger(Single)

Avgör om ett värde representerar ett integralvärde.

IsNaN(Single)

Returnerar ett värde som anger om det angivna värdet inte är ett tal (NaN).

IsNegative(Single)

Avgör om det angivna värdet är negativt.

IsNegativeInfinity(Single)

Returnerar ett värde som anger om det angivna talet utvärderas till negativ oändlighet.

IsNormal(Single)

Avgör om det angivna värdet är normalt.

IsOddInteger(Single)

Avgör om ett värde representerar ett udda integraltal.

IsPositive(Single)

Avgör om ett värde är positivt.

IsPositiveInfinity(Single)

Returnerar ett värde som anger om det angivna talet utvärderas till positiv oändlighet.

IsPow2(Single)

Avgör om ett värde är en kraft på två.

IsRealNumber(Single)

Avgör om ett värde representerar ett verkligt tal.

IsSubnormal(Single)

Avgör om det angivna värdet är subnormalt.

Lerp(Single, Single, Single)

Utför en linjär interpolering mellan två värden baserat på den angivna vikten.

Log(Single, Single)

Beräknar logaritmen för ett värde i den angivna basen.

Log(Single)

Beräknar det naturliga (base-E logaritmen för ett värde.

Log10(Single)

Beräknar base-10-logaritmen för ett värde.

Log10P1(Single)

Beräknar logaritmen base-10 för ett värde plus ett.

Log2(Single)

Beräknar log2 för ett värde.

Log2P1(Single)

Beräknar base-2-logaritmen för ett värde plus ett.

LogP1(Single)

Beräknar den naturliga (base-E) logaritmen för ett värde plus ett.

Max(Single, Single)

Jämför två värden med beräkning som är större.

MaxMagnitude(Single, Single)

Jämför två värden med beräkning som är större.

MaxMagnitudeNumber(Single, Single)

Jämför två värden med beräkning som har större storlek och returnerar det andra värdet om en indata är NaN.

MaxNative(Single, Single)

Jämför två värden med beräkning som är större med plattformsspecifikt beteende för NaN och NegativeZero.

MaxNumber(Single, Single)

Jämför två värden med beräkning som är större och returnerar det andra värdet om en indata är NaN.

Min(Single, Single)

Jämför två värden med beräkning som är mindre.

MinMagnitude(Single, Single)

Jämför två värden med beräkning som är mindre.

MinMagnitudeNumber(Single, Single)

Jämför två värden med beräkning som har mindre storlek och returnerar det andra värdet om en indata är NaN.

MinNative(Single, Single)

Jämför två värden med beräkning som är mindre med plattformsspecifikt beteende för NaN och NegativeZero.

MinNumber(Single, Single)

Jämför två värden med beräkning som är mindre och returnerar det andra värdet om en indata är NaN.

MultiplyAddEstimate(Single, Single, Single)

Beräknar en uppskattning av (left * right) + addend.

Parse(ReadOnlySpan<Byte>, IFormatProvider)

Parsar ett intervall med UTF-8 tecken till ett värde.

Parse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider)

Parsar ett intervall med UTF-8 tecken till ett värde.

Parse(ReadOnlySpan<Char>, IFormatProvider)

Parsar ett teckenintervall till ett värde.

Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider)

Konverterar ett teckenintervall som innehåller strängrepresentationen av ett tal i ett angivet format och kulturspecifikt format till dess flytande punktnummer med enkel precision.

Parse(String, IFormatProvider)

Konverterar strängrepresentationen av ett tal i ett angivet kulturspecifikt format till dess flytande punktnummer med enkel precision.

Parse(String, NumberStyles, IFormatProvider)

Konverterar strängrepresentationen av ett tal i ett angivet format och kulturspecifikt format till dess flytande punktnummer med enkel precision.

Parse(String, NumberStyles)

Konverterar strängrepresentationen av ett tal i ett angivet format till dess flytande punktnummer med enkel precision.

Parse(String)

Konverterar strängrepresentationen av ett tal till dess flyttalsnummer med enkel precision.

Pow(Single, Single)

Beräknar ett värde som har upphöjts till en viss effekt.

RadiansToDegrees(Single)

Konverterar ett givet värde från radianer till grader.

ReciprocalEstimate(Single)

Beräknar en uppskattning av ett värdes ömsesidiga värde.

ReciprocalSqrtEstimate(Single)

Beräknar en uppskattning av den ömsesidiga kvadratroten för ett värde.

RootN(Single, Int32)

Beräknar den n:e roten för ett värde.

Round(Single, Int32, MidpointRounding)

Avrundar ett värde till ett angivet antal bråksiffror med standard avrundningsläget (ToEven).

Round(Single, Int32)

Avrundar ett värde till ett angivet antal bråksiffror med standard avrundningsläget (ToEven).

Round(Single, MidpointRounding)

Avrundar ett värde till närmaste heltal med det angivna avrundningsläget.

Round(Single)

Avrundar ett värde till närmaste heltal med standard avrundningsläget (ToEven).

ScaleB(Single, Int32)

Beräknar produkten av ett värde och dess basradix upphöjt till den angivna kraften.

Sign(Single)

Beräknar tecknet för ett värde.

Sin(Single)

Beräknar sinus för ett värde.

SinCos(Single)

Beräknar sinus och cosinus för ett värde.

SinCosPi(Single)

Beräknar sinus och cosinus för ett värde.

Sinh(Single)

Beräknar hyperbolisk sinus för ett värde.

SinPi(Single)

Beräknar sinus för ett värde som har multiplicerats pimed .

Sqrt(Single)

Beräknar kvadratroten för ett värde.

Tan(Single)

Beräknar tangensen för ett värde.

Tanh(Single)

Beräknar hyperbolisk tangens för ett värde.

TanPi(Single)

Beräknar tangensen för ett värde som har multipelts av pi.

ToString()

Konverterar det numeriska värdet för den här instansen till motsvarande strängrepresentation.

ToString(IFormatProvider)

Konverterar det numeriska värdet för den här instansen till motsvarande strängrepresentation med den angivna kulturspecifika formatinformationen.

ToString(String, IFormatProvider)

Konverterar det numeriska värdet för den här instansen till motsvarande strängrepresentation med det angivna formatet och den kulturspecifika formatinformationen.

ToString(String)

Konverterar det numeriska värdet för den här instansen till motsvarande strängrepresentation med det angivna formatet.

Truncate(Single)

Trunkerar ett värde.

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

Försöker formatera värdet för den aktuella instansen som UTF-8 i det angivna byteintervallet.

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

Försöker formatera värdet för den aktuella flyttalsnummerinstansen till det angivna intervallet med tecken.

TryParse(ReadOnlySpan<Byte>, IFormatProvider, Single)

Försöker parsa ett intervall med UTF-8 tecken till ett värde.

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

Försöker parsa ett intervall med UTF-8 tecken till ett värde.

TryParse(ReadOnlySpan<Byte>, Single)

Försöker konvertera ett UTF-8-teckensintervall som innehåller strängrepresentationen av ett tal till dess flytande punktnummer med enkel precision.

TryParse(ReadOnlySpan<Char>, IFormatProvider, Single)

Försöker parsa ett teckenintervall till ett värde.

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

Konverterar spännviddsrepresentationen av ett tal i ett angivet format och kulturspecifikt format till dess flytande punktnummer med enkel precision. Ett returvärde anger om konverteringen lyckades eller misslyckades.

TryParse(ReadOnlySpan<Char>, Single)

Konverterar strängrepresentationen av ett tal i ett teckenintervall till dess flytande punktnummer med enkel precision. Ett returvärde anger om konverteringen lyckades eller misslyckades.

TryParse(String, IFormatProvider, Single)

Försöker parsa en sträng till ett värde.

TryParse(String, NumberStyles, IFormatProvider, Single)

Konverterar strängrepresentationen av ett tal i ett angivet format och kulturspecifikt format till dess flytande punktnummer med enkel precision. Ett returvärde anger om konverteringen lyckades eller misslyckades.

TryParse(String, Single)

Konverterar strängrepresentationen av ett tal till dess flyttalsnummer med enkel precision. Ett returvärde anger om konverteringen lyckades eller misslyckades.

Operatorer

Name Description
Equality(Single, Single)

Returnerar ett värde som anger om två angivna Single värden är lika med.

GreaterThan(Single, Single)

Returnerar ett värde som anger om ett angivet Single värde är större än ett annat angivet Single värde.

GreaterThanOrEqual(Single, Single)

Returnerar ett värde som anger om ett angivet Single värde är större än eller lika med ett annat angivet Single värde.

Inequality(Single, Single)

Returnerar ett värde som anger om två angivna Single värden inte är lika med.

LessThan(Single, Single)

Returnerar ett värde som anger om ett angivet Single värde är mindre än ett annat angivet Single värde.

LessThanOrEqual(Single, Single)

Returnerar ett värde som anger om ett angivet Single värde är mindre än eller lika med ett annat angivet Single värde.

Explicita gränssnittsimplementeringar

Name Description
IAdditionOperators<Single,Single,Single>.Addition(Single, Single)

Lägger till två värden tillsammans för att beräkna summan.

IAdditiveIdentity<Single,Single>.AdditiveIdentity

Hämtar den aktuella typens additiva identitet.

IBinaryNumber<Single>.AllBitsSet

Hämtar en instans av den binära typen där alla bitar anges.

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

Beräknar bitvis och av två värden.

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

Beräknar bitvis eller två värden.

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

Beräknar uteslutande eller av två värden.

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

Beräknar enkomplementrepresentationen av ett visst värde.

IComparable.CompareTo(Object)

Jämför den aktuella instansen med ett annat objekt av samma typ och returnerar ett heltal som anger om den aktuella instansen föregår, följer eller inträffar i samma position i sorteringsordningen som det andra objektet.

IConvertible.GetTypeCode()

Returnerar för den här instansen TypeCode .

IConvertible.ToBoolean(IFormatProvider)

En beskrivning av den här medlemmen finns i ToBoolean(IFormatProvider).

IConvertible.ToByte(IFormatProvider)

En beskrivning av den här medlemmen finns i ToByte(IFormatProvider).

IConvertible.ToChar(IFormatProvider)

Den här konverteringen stöds inte. Om du försöker använda den här metoden utlöser en InvalidCastException.

IConvertible.ToDateTime(IFormatProvider)

Den här konverteringen stöds inte. Om du försöker använda den här metoden utlöser en InvalidCastException.

IConvertible.ToDecimal(IFormatProvider)

En beskrivning av den här medlemmen finns i ToDecimal(IFormatProvider).

IConvertible.ToDouble(IFormatProvider)

En beskrivning av den här medlemmen finns i ToDouble(IFormatProvider).

IConvertible.ToInt16(IFormatProvider)

En beskrivning av den här medlemmen finns i ToInt16(IFormatProvider).

IConvertible.ToInt32(IFormatProvider)

En beskrivning av den här medlemmen finns i ToInt32(IFormatProvider).

IConvertible.ToInt64(IFormatProvider)

En beskrivning av den här medlemmen finns i ToInt64(IFormatProvider).

IConvertible.ToSByte(IFormatProvider)

En beskrivning av den här medlemmen finns i ToSByte(IFormatProvider).

IConvertible.ToSingle(IFormatProvider)

En beskrivning av den här medlemmen finns i ToSingle(IFormatProvider).

IConvertible.ToType(Type, IFormatProvider)

En beskrivning av den här medlemmen finns i ToType(Type, IFormatProvider).

IConvertible.ToUInt16(IFormatProvider)

En beskrivning av den här medlemmen finns i ToUInt16(IFormatProvider).

IConvertible.ToUInt32(IFormatProvider)

En beskrivning av den här medlemmen finns i ToUInt32(IFormatProvider).

IConvertible.ToUInt64(IFormatProvider)

En beskrivning av den här medlemmen finns i ToUInt64(IFormatProvider).

IDecrementOperators<Single>.Decrement(Single)

Minskar ett värde.

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

Delar upp ett värde med ett annat för att beräkna deras kvot.

IFloatingPoint<Single>.GetExponentByteCount()

Hämtar antalet byte som ska skrivas som en del av TryWriteExponentLittleEndian(Span<Byte>, Int32).

IFloatingPoint<Single>.GetExponentShortestBitLength()

Hämtar längden, i bitar, på de kortaste tvås komplementrepresentation av den aktuella exponenten.

IFloatingPoint<Single>.GetSignificandBitLength()

Hämtar längden, i bitar, på den aktuella significanden.

IFloatingPoint<Single>.GetSignificandByteCount()

Hämtar antalet byte som ska skrivas som en del av TryWriteSignificandLittleEndian(Span<Byte>, Int32).

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

Försöker skriva den aktuella exponenten, i stor endianskt format, till ett givet spann.

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

Försöker skriva den aktuella exponenten, i lite endianskt format, till ett givet spann.

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

Försöker skriva den aktuella significand, i big-endian format, till ett visst spann.

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

Försöker skriva den aktuella significand, i lite-endian format, till ett givet spann.

IFloatingPointConstants<Single>.E

Hämtar den matematiska konstanten e.

IFloatingPointConstants<Single>.Pi

Hämtar den matematiska konstanten pi.

IFloatingPointConstants<Single>.Tau

Hämtar den matematiska konstanten tau.

IFloatingPointIeee754<Single>.Epsilon

Hämtar det minsta värdet som kan läggas till 0 som inte resulterar i 0.

IFloatingPointIeee754<Single>.NaN

Hämtar ett värde som representerar NaN.

IFloatingPointIeee754<Single>.NegativeInfinity

Hämtar ett värde som representerar negativt infinity.

IFloatingPointIeee754<Single>.NegativeZero

Hämtar ett värde som representerar negativt zero.

IFloatingPointIeee754<Single>.PositiveInfinity

Hämtar ett värde som representerar positivt infinity.

IIncrementOperators<Single>.Increment(Single)

Ökar ett värde.

IMinMaxValue<Single>.MaxValue

Hämtar det maximala värdet för den aktuella typen.

IMinMaxValue<Single>.MinValue

Hämtar det lägsta värdet för den aktuella typen.

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

Delar upp två värden för att beräkna deras modulus eller rest.

IMultiplicativeIdentity<Single,Single>.MultiplicativeIdentity

Hämtar den multiplicativa identiteten för den aktuella typen.

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

Multiplicerar två värden tillsammans för att beräkna produkten.

INumberBase<Single>.IsCanonical(Single)

Avgör om ett värde finns i dess kanoniska representation.

INumberBase<Single>.IsComplexNumber(Single)

Avgör om ett värde representerar ett komplext tal.

INumberBase<Single>.IsImaginaryNumber(Single)

Avgör om ett värde representerar ett rent imaginärt tal.

INumberBase<Single>.IsZero(Single)

Avgör om ett värde är noll.

INumberBase<Single>.One

Hämtar värdet 1 för typen.

INumberBase<Single>.Radix

Hämtar radixet, eller basen, för typen.

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

Representerar en flyttalstyp med enkel precision.

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

Representerar en flyttalstyp med enkel precision.

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

Representerar en flyttalstyp med enkel precision.

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

Försöker konvertera en instans av den aktuella typen till en annan typ, vilket utlöser ett spill-undantag för värden som ligger utanför det representerarbara intervallet för den aktuella typen.

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

Försöker konvertera en instans av den aktuella typen till en annan typ, vilket mättar alla värden som ligger utanför det representerarbara intervallet för den aktuella typen.

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

Försöker konvertera en instans av den aktuella typen till en annan typ och trunkerar alla värden som ligger utanför det representerarbara intervallet för den aktuella typen.

INumberBase<Single>.Zero

Hämtar värdet 0 för typen.

ISignedNumber<Single>.NegativeOne

Hämtar värdet -1 för typen.

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

Subtraherar två värden för att beräkna skillnaden.

IUnaryNegationOperators<Single,Single>.UnaryNegation(Single)

Beräknar en oharisk negation av ett värde.

IUnaryPlusOperators<Single,Single>.UnaryPlus(Single)

Beräknar det unary plus av ett värde.

Gäller för

Trådsäkerhet

Alla medlemmar av den här typen är trådsäkra. Medlemmar som verkar ändra instanstillstånd returnerar faktiskt en ny instans som initierats med det nya värdet. Precis som med andra typer måste läsning och skrivning till en delad variabel som innehåller en instans av den här typen skyddas av ett lås för att garantera trådsäkerheten.

Se även