Single Estructura
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Representa un número de punto flotante de precisión sencilla.
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
- Herencia
- Atributos
- Implementaciones
-
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>
Comentarios
El tipo de valor Single representa un número de 32 bits de precisión única con valores que van desde 3,402823e38 negativo hasta 3,402823e38, así como cero positivo o negativo, PositiveInfinity, NegativeInfinityy no un número (NaN). Está pensado para representar valores extremadamente grandes (como distancias entre planetas o galaxias) o extremadamente pequeños (como la masa molecular de una sustancia en kilogramos) y que a menudo son imprecisos (como la distancia de la tierra a otro sistema solar). El tipo Single cumple con el estándar IEC 60559:1989 (IEEE 754) para la aritmética de punto flotante binario.
System.Single proporciona métodos para comparar instancias de este tipo, convertir el valor de una instancia en su representación de cadena y convertir la representación de cadena de un número en una instancia de este tipo. Para obtener información sobre cómo los códigos de especificación de formato controlan la representación de cadena de los tipos de valor, vea Tipos de formato, cadenas de formato numérico estándary cadenas de formato numérico personalizado.
Representación y precisión de punto flotante
El Single tipo de datos almacena valores de punto flotante de precisión sencilla en un formato binario de 32 bits, como se muestra en la tabla siguiente:
| Parte | Bits |
|---|---|
| Significante o mantisa | 0-22 |
| Exponent | 23-30 |
| Signo (0 = positivo, 1 = negativo) | 31 |
Al igual que las fracciones decimales no pueden representar con precisión algunos valores fraccionarios (como 1/3 o Math.PI), las fracciones binarias no pueden representar algunos valores fraccionarios. Por ejemplo, 2/10, representado precisamente por .2 como fracción decimal, se representa mediante .0011111001001100 como una fracción binaria, con el patrón "1100" que se repite en infinito. En este caso, el valor de punto flotante proporciona una representación imprecisa del número que representa. La realización de operaciones matemáticas adicionales en el valor de punto flotante original a menudo aumenta su falta de precisión. Por ejemplo, si compara los resultados de multiplicar .3 por 10 y agregar .3 a .3 nueve veces, verá que la adición produce el resultado menos preciso, ya que implica ocho operaciones más que la multiplicación. Tenga en cuenta que esta disparidad solo es evidente si muestra los dos valores de Single mediante el uso de la cadena de formato numérico estándar "R" , que, si es necesario, muestra todos los 9 dígitos de precisión admitidos por el tipo Single.
using System;
public class Example12
{
public static void Main()
{
Single value = .2f;
Single result1 = value * 10f;
Single result2 = 0f;
for (int ctr = 1; ctr <= 10; ctr++)
result2 += value;
Console.WriteLine($".2 * 10: {result1:R}");
Console.WriteLine($".2 Added 10 times: {result2:R}");
}
}
// The example displays the following output:
// .2 * 10: 2
// .2 Added 10 times: 2.0000002
let value = 0.2f
let result1 = value * 10f
let mutable result2 = 0f
for _ = 1 to 10 do
result2 <- result2 + value
printfn $".2 * 10: {result1:R}"
printfn $".2 Added 10 times: {result2:R}"
// The example displays the following output:
// .2 * 10: 2
// .2 Added 10 times: 2.00000024
Module Example13
Public Sub Main()
Dim value As Single = 0.2
Dim result1 As Single = value * 10
Dim result2 As Single
For ctr As Integer = 1 To 10
result2 += value
Next
Console.WriteLine(".2 * 10: {0:R}", result1)
Console.WriteLine(".2 Added 10 times: {0:R}", result2)
End Sub
End Module
' The example displays the following output:
' .2 * 10: 2
' .2 Added 10 times: 2.0000002
Dado que algunos números no se pueden representar exactamente como valores binarios fraccionarios, los números de punto flotante solo pueden aproximarse a los números reales.
Todos los números de punto flotante tienen un número limitado de dígitos significativos, que también determina con qué precisión un valor de punto flotante se aproxima a un número real. Un valor Single tiene hasta 7 dígitos decimales de precisión, aunque un máximo de 9 dígitos se mantiene internamente. Esto significa que algunas operaciones de punto flotante pueden carecer de precisión para cambiar un valor de punto flotante. En el ejemplo siguiente se define un valor de punto flotante de precisión sencilla grande y, a continuación, se agrega el producto de Single.Epsilon y mil billones. Sin embargo, el producto es demasiado pequeño para modificar el valor de punto flotante original. Su dígito menos significativo es milésimas, mientras que el dígito más significativo del producto es 10-30.
using System;
public class Example13
{
public static void Main()
{
Single value = 123.456f;
Single additional = Single.Epsilon * 1e15f;
Console.WriteLine($"{value} + {additional} = {value + additional}");
}
}
// The example displays the following output:
// 123.456 + 1.401298E-30 = 123.456
open System
let value = 123.456f
let additional = Single.Epsilon * 1e15f
printfn $"{value} + {additional} = {value + additional}"
// The example displays the following output:
// 123.456 + 1.401298E-30 = 123.456
Module Example
Public Sub Main()
Dim value As Single = 123.456
Dim additional As Single = Single.Epsilon * 1e15
Console.WriteLine($"{value} + {additional} = {value + additional}")
End Sub
End Module
' The example displays the following output:
' 123.456 + 1.401298E-30 = 123.456
La precisión limitada de un número de punto flotante tiene varias consecuencias:
Dos números de punto flotante que aparecen iguales para una precisión determinada podrían no compararse iguales porque sus dígitos menos significativos son diferentes. En el ejemplo siguiente, se agregan una serie de números y su total se compara con su total esperado. Una llamada al
Equalsmétodo indica que los valores no son iguales.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).Los dos valores son desiguales debido a una pérdida de precisión durante las operaciones de adición. En este caso, el problema se puede resolver llamando al método Math.Round(Double, Int32) para redondear los valores de Single a la precisión deseada antes de realizar la comparación.
Una operación matemática o de comparación que usa un número de punto flotante podría no producir el mismo resultado si se usa un número decimal, ya que el número de punto flotante binario podría no ser igual al número decimal. En un ejemplo anterior se ilustra esto mostrando el resultado de multiplicar .3 por 10 y agregar .3 a .3 nueve veces.
Cuando la precisión de las operaciones numéricas con valores fraccionarios es importante, use el tipo Decimal en lugar del tipo de Single. Cuando la precisión de las operaciones numéricas con valores enteros más allá del intervalo de los tipos de Int64 o UInt64 es importante, use el tipo BigInteger.
Los valores de Single tienen menos precisión que los valores de Double. Un valor de Single que se convierte en un Double aparentemente equivalente no es igual al valor de Double debido a diferencias de precisión. En el ejemplo siguiente, el resultado de operaciones de división idénticas se asigna a un valor de Double y un valor de Single. Después de convertir el valor Single en un Double, una comparación de los dos valores muestra que son desiguales.
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: Falseopen 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: FalseModule 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: FalsePara evitar este problema, use el tipo de datos Double en lugar del tipo de datos Single o use el método Round para que ambos valores tengan la misma precisión.
Prueba de igualdad
Para considerarse igual, dos Single valores deben representar valores idénticos. Sin embargo, debido a las diferencias de precisión entre los valores, o debido a una pérdida de precisión por uno o ambos valores, los valores de punto flotante que se espera que sean idénticos suelen resultar diferentes debido a las diferencias en sus dígitos menos significativos. Como resultado, llama al método Equals para determinar si dos valores son iguales o llama al método CompareTo para determinar la relación entre dos valores de Single, a menudo produce resultados inesperados. Esto es evidente en el ejemplo siguiente, donde dos aparentemente iguales Single valores resultan ser desiguales, ya que el primer valor tiene 7 dígitos de precisión, mientras que el segundo valor tiene 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
Los valores calculados que siguen diferentes rutas de código y que se manipulan de maneras diferentes suelen resultar inequivales. En el ejemplo siguiente, se calcula un valor Single cuadrado y, a continuación, se calcula la raíz cuadrada para restaurar el valor original. Un segundo Single se multiplica por 3,51 y se cuadrado antes de que la raíz cuadrada del resultado se divida por 3,51 para restaurar el valor original. Aunque los dos valores parecen ser idénticos, una llamada al método Equals(Single) indica que no son iguales.
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
En los casos en los que es probable que una pérdida de precisión afecte al resultado de una comparación, puede usar las técnicas siguientes en lugar de llamar al método Equals o CompareTo:
Llame al método Math.Round para asegurarse de que ambos valores tienen la misma precisión. En el ejemplo siguiente se modifica un ejemplo anterior para usar este enfoque para que dos valores fraccionarios sean equivalentes.
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: Trueopen 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: TrueModule 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: TrueEl problema de precisión todavía se aplica al redondeo de valores de punto medio. Para obtener más información, consulte el método Math.Round(Double, Int32, MidpointRounding).
Pruebe la igualdad aproximada en lugar de la igualdad. Esta técnica requiere que defina una cantidad absoluta por la que los dos valores pueden diferir, pero seguir siendo iguales, o que defina una cantidad relativa por la que el valor más pequeño pueda diferir del valor mayor.
Warning
Single.Epsilon a veces se usa como medida absoluta de la distancia entre dos valores de Single al probar la igualdad. Sin embargo, Single.Epsilon mide el valor más pequeño posible que se puede agregar o restar de un Single cuyo valor es cero. Para la mayoría de los valores de Single positivos y negativos, el valor de Single.Epsilon es demasiado pequeño para detectarse. Por lo tanto, excepto para los valores que son cero, no se recomienda su uso en las pruebas para la igualdad.
En el ejemplo siguiente se usa el último enfoque para definir un método
IsApproximatelyEqualque prueba la diferencia relativa entre dos valores. También contrasta el resultado de las llamadas al métodoIsApproximatelyEqualy al método Equals(Single).public static void Main() { float one1 = .1f * 10; float one2 = 0f; for (int ctr = 1; ctr <= 10; ctr++) one2 += .1f; Console.WriteLine($"{one1:R} = {one2:R}: {one1.Equals(one2)}"); Console.WriteLine($"{one1:R} is approximately equal to {one2:R}: " + $"{IsApproximatelyEqual(one1, one2, .000001f)}"); float negativeOne1 = -1 * one1; float negativeOne2 = -1 * one2; Console.WriteLine($"{negativeOne1:R} = {negativeOne2:R}: {negativeOne1.Equals(negativeOne2)}"); Console.WriteLine($"{negativeOne1:R} is approximately equal to {negativeOne2:R}: " + $"{IsApproximatelyEqual(negativeOne1, negativeOne2, .000001f)}"); } static bool IsApproximatelyEqual(float value1, float value2, float epsilon) { // If they are equal anyway, just return True. if (value1.Equals(value2)) return true; // Handle NaN, Infinity. if (Double.IsInfinity(value1) | Double.IsNaN(value1)) return value1.Equals(value2); else if (Double.IsInfinity(value2) | Double.IsNaN(value2)) return value1.Equals(value2); // Handle zero to avoid division by zero. double divisor = Math.Max(value1, value2); if (divisor.Equals(0)) divisor = Math.Min(value1, value2); return Math.Abs((value1 - value2) / divisor) <= epsilon; } // The example displays the following output on .NET: // 1 = 1.0000001: False // 1 is approximately equal to 1.0000001: True // -1 = -1.0000001: False // -1 is approximately equal to -1.0000001: Trueopen 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: TruePublic 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
Valores y excepciones de punto flotante
Las operaciones con valores de punto flotante no lanzan excepciones, a diferencia de las operaciones con tipos enteros, que lanzan excepciones en casos de operaciones ilegales, como la división por cero o el desbordamiento. En su lugar, en estas situaciones, el resultado de una operación de punto flotante es cero, infinito positivo, infinito negativo o no un número (NaN):
Si el resultado de una operación de punto flotante es demasiado pequeño para el formato de destino, el resultado es cero. Esto puede ocurrir cuando se multiplican dos números de punto flotante muy pequeños, como se muestra en el ejemplo siguiente.
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: Truelet 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: TrueModule 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: TrueSi la magnitud del resultado de una operación de punto flotante supera el intervalo del formato de destino, el resultado de la operación es PositiveInfinity o NegativeInfinity, según corresponda para el signo del resultado. El resultado de una operación que desborda Single.MaxValue es PositiveInfinityy el resultado de una operación que desborda Single.MinValue es NegativeInfinity, como se muestra en el ejemplo siguiente.
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: Trueopen 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: TrueModule 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: TruePositiveInfinity también resulta de una división por cero con un dividendo positivo y NegativeInfinity resulta de una división por cero con un dividendo negativo.
Si una operación de punto flotante no es válida, el resultado de la operación es NaN. Por ejemplo, NaN resulta de las siguientes operaciones:
- División por cero con un dividendo de cero. Tenga en cuenta que otros casos de división por cero dan como resultado PositiveInfinity o NegativeInfinity.
- Cualquier operación de punto flotante con entrada no válida. Por ejemplo, al intentar encontrar la raíz cuadrada de un valor negativo, se devuelve NaN.
- Cualquier operación con un argumento cuyo valor es Single.NaN.
Conversiones de tipos
La estructura Single no define ningún operador de conversión explícito o implícito; en su lugar, el compilador implementa las conversiones.
En la tabla siguiente se enumeran las posibles conversiones de un valor de los otros tipos numéricos primitivos en un Single valor. También indica si la conversión está ampliando o estrechando y si el resultado Single puede tener menos precisión que el valor original.
| Conversión de | Ampliación/reducción | Posible pérdida de precisión |
|---|---|---|
| Byte | Ampliación | No |
| Decimal | Ampliación Tenga en cuenta que C# requiere un operador de conversión. |
Sí. Decimal admite 29 dígitos decimales de precisión; Single admite 9. |
| Double | Estrechamiento; Los valores fuera del intervalo se convierten en Double.NegativeInfinity o Double.PositiveInfinity. | Sí. Double admite 17 dígitos decimales de precisión; Single admite 9. |
| Int16 | Ampliación | No |
| Int32 | Ampliación | Sí. Int32 admite 10 dígitos decimales de precisión; Single admite 9. |
| Int64 | Ampliación | Sí. Int64 admite 19 dígitos decimales de precisión; Single admite 9. |
| SByte | Ampliación | No |
| UInt16 | Ampliación | No |
| UInt32 | Ampliación | Sí. UInt32 admite 10 dígitos decimales de precisión; Single admite 9. |
| UInt64 | Ampliación | Sí. Int64 admite 20 dígitos decimales de precisión; Single admite 9. |
En el ejemplo siguiente se convierte el valor mínimo o máximo de otros tipos numéricos primitivos en un valor de Single.
using System;
public class Example4
{
public static void Main()
{
dynamic[] values = { Byte.MinValue, Byte.MaxValue, Decimal.MinValue,
Decimal.MaxValue, Double.MinValue, Double.MaxValue,
Int16.MinValue, Int16.MaxValue, Int32.MinValue,
Int32.MaxValue, Int64.MinValue, Int64.MaxValue,
SByte.MinValue, SByte.MaxValue, UInt16.MinValue,
UInt16.MaxValue, UInt32.MinValue, UInt32.MaxValue,
UInt64.MinValue, UInt64.MaxValue };
float sngValue;
foreach (var value in values)
{
if (value.GetType() == typeof(Decimal) ||
value.GetType() == typeof(Double))
sngValue = (float)value;
else
sngValue = value;
Console.WriteLine($"{value} ({value.GetType().Name}) --> {sngValue:R} ({sngValue.GetType().Name})");
}
}
}
// The example displays the following output:
// 0 (Byte) --> 0 (Single)
// 255 (Byte) --> 255 (Single)
// -79228162514264337593543950335 (Decimal) --> -7.92281625E+28 (Single)
// 79228162514264337593543950335 (Decimal) --> 7.92281625E+28 (Single)
// -1.79769313486232E+308 (Double) --> -Infinity (Single)
// 1.79769313486232E+308 (Double) --> Infinity (Single)
// -32768 (Int16) --> -32768 (Single)
// 32767 (Int16) --> 32767 (Single)
// -2147483648 (Int32) --> -2.14748365E+09 (Single)
// 2147483647 (Int32) --> 2.14748365E+09 (Single)
// -9223372036854775808 (Int64) --> -9.223372E+18 (Single)
// 9223372036854775807 (Int64) --> 9.223372E+18 (Single)
// -128 (SByte) --> -128 (Single)
// 127 (SByte) --> 127 (Single)
// 0 (UInt16) --> 0 (Single)
// 65535 (UInt16) --> 65535 (Single)
// 0 (UInt32) --> 0 (Single)
// 4294967295 (UInt32) --> 4.2949673E+09 (Single)
// 0 (UInt64) --> 0 (Single)
// 18446744073709551615 (UInt64) --> 1.84467441E+19 (Single)
open System
let values: obj list =
[ Byte.MinValue; Byte.MaxValue; Decimal.MinValue
Decimal.MaxValue; Double.MinValue; Double.MaxValue
Int16.MinValue; Int16.MaxValue; Int32.MinValue
Int32.MaxValue; Int64.MinValue; Int64.MaxValue
SByte.MinValue; SByte.MaxValue; UInt16.MinValue
UInt16.MaxValue; UInt32.MinValue; UInt32.MaxValue
UInt64.MinValue; UInt64.MaxValue ]
for value in values do
let sngValue =
match value with
| :? byte as v -> float32 v
| :? decimal as v -> float32 v
| :? double as v -> float32 v
| :? int16 as v -> float32 v
| :? int as v -> float32 v
| :? int64 as v -> float32 v
| :? int8 as v -> float32 v
| :? uint16 as v -> float32 v
| :? uint as v -> float32 v
| :? uint64 as v -> float32 v
| _ -> raise (NotImplementedException "Unknown Type")
printfn $"{value} ({value.GetType().Name}) --> {sngValue:R} ({sngValue.GetType().Name})"
// The example displays the following output:
// 0 (Byte) --> 0 (Single)
// 255 (Byte) --> 255 (Single)
// -79228162514264337593543950335 (Decimal) --> -7.92281625E+28 (Single)
// 79228162514264337593543950335 (Decimal) --> 7.92281625E+28 (Single)
// -1.79769313486232E+308 (Double) --> -Infinity (Single)
// 1.79769313486232E+308 (Double) --> Infinity (Single)
// -32768 (Int16) --> -32768 (Single)
// 32767 (Int16) --> 32767 (Single)
// -2147483648 (Int32) --> -2.14748365E+09 (Single)
// 2147483647 (Int32) --> 2.14748365E+09 (Single)
// -9223372036854775808 (Int64) --> -9.223372E+18 (Single)
// 9223372036854775807 (Int64) --> 9.223372E+18 (Single)
// -128 (SByte) --> -128 (Single)
// 127 (SByte) --> 127 (Single)
// 0 (UInt16) --> 0 (Single)
// 65535 (UInt16) --> 65535 (Single)
// 0 (UInt32) --> 0 (Single)
// 4294967295 (UInt32) --> 4.2949673E+09 (Single)
// 0 (UInt64) --> 0 (Single)
// 18446744073709551615 (UInt64) --> 1.84467441E+19 (Single)
Module Example5
Public Sub Main()
Dim values() As Object = {Byte.MinValue, Byte.MaxValue, Decimal.MinValue,
Decimal.MaxValue, Double.MinValue, Double.MaxValue,
Int16.MinValue, Int16.MaxValue, Int32.MinValue,
Int32.MaxValue, Int64.MinValue, Int64.MaxValue,
SByte.MinValue, SByte.MaxValue, UInt16.MinValue,
UInt16.MaxValue, UInt32.MinValue, UInt32.MaxValue,
UInt64.MinValue, UInt64.MaxValue}
Dim sngValue As Single
For Each value In values
If value.GetType() = GetType(Double) Then
sngValue = CSng(value)
Else
sngValue = value
End If
Console.WriteLine("{0} ({1}) --> {2:R} ({3})",
value, value.GetType().Name,
sngValue, sngValue.GetType().Name)
Next
End Sub
End Module
' The example displays the following output:
' 0 (Byte) --> 0 (Single)
' 255 (Byte) --> 255 (Single)
' -79228162514264337593543950335 (Decimal) --> -7.92281625E+28 (Single)
' 79228162514264337593543950335 (Decimal) --> 7.92281625E+28 (Single)
' -1.79769313486232E+308 (Double) --> -Infinity (Single)
' 1.79769313486232E+308 (Double) --> Infinity (Single)
' -32768 (Int16) --> -32768 (Single)
' 32767 (Int16) --> 32767 (Single)
' -2147483648 (Int32) --> -2.14748365E+09 (Single)
' 2147483647 (Int32) --> 2.14748365E+09 (Single)
' -9223372036854775808 (Int64) --> -9.223372E+18 (Single)
' 9223372036854775807 (Int64) --> 9.223372E+18 (Single)
' -128 (SByte) --> -128 (Single)
' 127 (SByte) --> 127 (Single)
' 0 (UInt16) --> 0 (Single)
' 65535 (UInt16) --> 65535 (Single)
' 0 (UInt32) --> 0 (Single)
' 4294967295 (UInt32) --> 4.2949673E+09 (Single)
' 0 (UInt64) --> 0 (Single)
' 18446744073709551615 (UInt64) --> 1.84467441E+19 (Single)
Además, los valores de DoubleDouble.NaN, Double.PositiveInfinityy Double.NegativeInfinity convierten en Single.NaN, Single.PositiveInfinityy Single.NegativeInfinity, respectivamente.
Tenga en cuenta que la conversión del valor de algunos tipos numéricos a un valor de Single puede implicar una pérdida de precisión. Como se muestra en el ejemplo, es posible una pérdida de precisión al convertir Decimal, Double, Int32, Int64, UInt32y valores de UInt64 en valores de Single.
La conversión de un valor de Single a un Double es una conversión de ampliación. La conversión puede dar lugar a una pérdida de precisión si el tipo de Double no tiene una representación precisa para el valor de Single.
La conversión de un valor de Single a un valor de cualquier tipo de datos numérico primitivo distinto de un Double es una conversión de restricción y requiere un operador de conversión (en C#) o un método de conversión (en Visual Basic). Los valores que están fuera del intervalo del tipo de datos de destino, que se definen mediante las propiedades MinValue y MaxValue del tipo de destino, se comportan como se muestra en la tabla siguiente.
| Tipo de destino | Result |
|---|---|
| Cualquier tipo entero | Excepción de OverflowException si la conversión se produce en un contexto comprobado. Si la conversión se produce en un contexto no comprobado (el valor predeterminado en C#), la operación de conversión se realiza correctamente, pero el valor se desborda. |
| Decimal | Una OverflowException excepción. |
Además, Single.NaN, Single.PositiveInfinityy Single.NegativeInfinity lanzan un OverflowException para conversiones a enteros en un contexto comprobado, pero estos valores se desbordan cuando se convierten a enteros en un contexto sin comprobación. Para las conversiones a Decimal, siempre lanzan un/a OverflowException. Para las conversiones a Double, estas se transforman en Double.NaN, Double.PositiveInfinityy Double.NegativeInfinity, respectivamente.
Tenga en cuenta que una pérdida de precisión puede dar lugar a la conversión de un valor de Single a otro tipo numérico. En el caso de convertir valores de Single no enteros, como se muestra en la salida del ejemplo, el componente fraccionario se pierde cuando el valor de Single se redondea (como en Visual Basic) o se trunca (como en C# y F#). Para las conversiones a valores de Decimal, es posible que el valor de Single no tenga una representación precisa en el tipo de datos de destino.
En el ejemplo siguiente se convierte una serie de valores de Single en otros tipos numéricos. Las conversiones se producen en un contexto comprobado en Visual Basic (que es el valor predeterminado), en C# (debido a la palabra clave checked) y en F# (debido a la instrucción open Checked). La conclusión del ejemplo muestra el resultado de las conversiones en un contexto tanto comprobado como no comprobado. Puede realizar conversiones en un contexto no comprobado en Visual Basic al compilar con el modificador de compilación /removeintchecks+, en C# al comentar la instrucción checked, y en F# al comentar la instrucción 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)
Para obtener más información sobre la conversión de tipos numéricos, vea Type Conversion in .NET and Type Conversion Tables.
Funcionalidad de punto flotante
La estructura Single y los tipos relacionados proporcionan métodos para realizar las siguientes categorías de operaciones:
Comparación de valores. Puede llamar al método Equals para determinar si dos valores Single son iguales o el método CompareTo para determinar la relación entre dos valores.
La estructura Single también admite un conjunto completo de operadores de comparación. Por ejemplo, puede probar la igualdad o la desigualdad, o determinar si un valor es mayor o igual que otro. Si uno de los operandos es un Double, el valor de Single se convierte en un Double antes de realizar la comparación. Si uno de los operandos es un tipo entero, se convierte en un Single antes de realizar la comparación. Aunque estas son conversiones de ampliación, pueden implicar una pérdida de precisión.
Warning
Debido a las diferencias de precisión, dos Single valores que se espera que sean iguales pueden resultar desiguales, lo que afecta al resultado de la comparación. Consulte la sección Prueba de igualdad para obtener más información sobre la comparación de dos valores de Single.
También puede llamar a los métodos IsNaN, IsInfinity, IsPositiveInfinityy IsNegativeInfinity para probar estos valores especiales.
Operaciones matemáticas Las operaciones aritméticas comunes, como la suma, la resta, la multiplicación y la división se implementan mediante compiladores de lenguaje y instrucciones de lenguaje intermedio común (CIL) en lugar de mediante métodos de Single. Si el otro operando de una operación matemática es un Double, el Single se convierte en un Double antes de realizar la operación y el resultado de la operación también es un valor Double. Si el otro operando es un tipo entero, se convierte en un Single antes de realizar la operación y el resultado de la operación también es un valor Single.
Puede realizar otras operaciones matemáticas llamando a métodos
static(Shareden Visual Basic) en la clase System.Math. Estos incluyen métodos adicionales que se usan habitualmente para la aritmética (como Math.Abs, Math.Signy Math.Sqrt), geometría (como Math.Cos y Math.Sin) y cálculo (como Math.Log). En todos los casos, el valor de Single se convierte en un Double.También puede manipular los bits individuales en un valor de Single. El método BitConverter.GetBytes(Single) devuelve su patrón de bits en una matriz de bytes. Al pasar esa matriz de bytes al método BitConverter.ToInt32, también puede conservar el patrón de bits del valor de Single en un entero de 32 bits.
Redondeo. El redondeo se suele usar como técnica para reducir el impacto de las diferencias entre los valores causados por problemas de representación y precisión de punto flotante. Puede redondear un Single valor llamando al método Math.Round. Sin embargo, tenga en cuenta que el valor de Single se convierte en un Double antes de llamar al método y la conversión puede implicar una pérdida de precisión.
Formato. Puede convertir un valor de Single en su representación de cadena llamando al método ToString o mediante la característica de formato compuesto . Para obtener información sobre cómo las cadenas de formato controlan la representación en cadena de los valores de punto flotante, consulte Cadenas con formato numérico estándar y Cadenas con formato numérico personalizado.
Análisis de cadenas. Puede convertir la representación de cadena de un valor de punto flotante en un valor de Single llamando al método Parse o TryParse. Si se produce un error en la operación de análisis, el método Parse produce una excepción, mientras que el método TryParse devuelve
false.Conversión de tipos. La estructura Single proporciona una implementación de interfaz explícita para la interfaz IConvertible, que admite la conversión entre dos tipos de datos estándar .NET. Los compiladores de lenguaje también admiten la conversión implícita de valores para todos los demás tipos numéricos estándar, excepto la conversión de Double a Single valores. La conversión de un valor de cualquier tipo numérico estándar distinto de un Double a un Single es una conversión de ampliación y no requiere el uso de un operador de conversión o método de conversión.
Sin embargo, la conversión de valores enteros de 32 y 64 bits puede implicar una pérdida de precisión. En la tabla siguiente se enumeran las diferencias de precisión de los tipos de 32 bits, 64 bits y Double:
Tipo Precisión máxima (dígitos decimales) Precisión interna (dígitos decimales) Double 15 17 Int32 y UInt32 10 10 Int64 y UInt64 19 19 Single 7 9 El problema de precisión afecta con más frecuencia a los valores de Single que se convierten en valores de Double. En el ejemplo siguiente, dos valores generados por operaciones de división idénticas no son iguales, ya que uno de los valores es un valor de punto flotante de precisión sencilla que se convierte en un Double.
Double value1 = 1 / 3.0; Single sValue2 = 1 / 3.0f; Double value2 = (Double)sValue2; Console.WriteLine($"{value1:R} = {value2:R}: {value1.Equals(value2)}"); // The example displays the following output on .NET: // 0.3333333333333333 = 0.3333333432674408: Falselet 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: FalseDim 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
Campos
| Nombre | Description |
|---|---|
| E |
Representa la base logarítmica natural, especificada por la constante, e. |
| Epsilon |
Representa el valor positivo Single más pequeño que es mayor que cero. Este campo es constante. |
| MaxValue |
Representa el valor más grande posible de Single. Este campo es constante. |
| MinValue |
Representa el valor más pequeño posible de Single. Este campo es constante. |
| NaN |
Representa no un número ( |
| NegativeInfinity |
Representa infinito negativo. Este campo es constante. |
| NegativeZero |
Representa el número negativo cero (-0). |
| Pi |
Representa la relación de la circunferencia de un círculo a su diámetro, especificado por la constante, π. |
| PositiveInfinity |
Representa infinito positivo. Este campo es constante. |
| Tau |
Representa el número de radianes en un turno, especificado por la constante, τ. |
Métodos
| Nombre | Description |
|---|---|
| Abs(Single) |
Calcula el valor absoluto de un valor. |
| Acos(Single) |
Calcula el arco-coseno de un valor. |
| Acosh(Single) |
Calcula el coseno de arco hiperbólico de un valor. |
| AcosPi(Single) |
Calcula el arco-coseno de un valor y divide el resultado por |
| Asin(Single) |
Calcula el arco seno de un valor. |
| Asinh(Single) |
Calcula el arco-seno hiperbólico de un valor. |
| AsinPi(Single) |
Calcula el arco-seno de un valor y divide el resultado por |
| Atan(Single) |
Calcula la tangente de arco de un valor. |
| Atan2(Single, Single) |
Calcula la tangente de arco del cociente de dos valores. |
| Atan2Pi(Single, Single) |
Calcula la tangente de arco para el cociente de dos valores y divide el resultado por |
| Atanh(Single) |
Calcula la tangente de arco hiperbólico de un valor. |
| AtanPi(Single) |
Calcula la tangente de arco de un valor y divide el resultado por pi. |
| BitDecrement(Single) |
Devuelve el valor más grande que compara menos que un valor especificado. |
| BitIncrement(Single) |
Devuelve el valor más pequeño que compara mayor que un valor especificado. |
| Cbrt(Single) |
Calcula la raíz del cubo de un valor. |
| Ceiling(Single) |
Calcula el límite máximo de un valor. |
| Clamp(Single, Single, Single) |
Fija un valor en un valor mínimo inclusivo y máximo. |
| ClampNative(Single, Single, Single) |
Abraza un valor a un valor mínimo y máximo inclusivo mediante el comportamiento específico de la plataforma para |
| CompareTo(Object) |
Compara esta instancia con un objeto especificado y devuelve un entero que indica si el valor de esta instancia es menor, igual o mayor que el valor del objeto especificado. |
| CompareTo(Single) |
Compara esta instancia con un número de punto flotante de precisión sencilla especificado y devuelve un entero que indica si el valor de esta instancia es menor, igual o mayor que el valor del número de punto flotante de precisión sencilla especificado. |
| ConvertToInteger<TInteger>(Single) |
Convierte un valor en un tipo entero especificado mediante saturación en desbordamiento. |
| ConvertToIntegerNative<TInteger>(Single) |
Convierte un valor en un tipo entero especificado mediante el comportamiento específico de la plataforma en el desbordamiento. |
| CopySign(Single, Single) |
Copia el signo de un valor en el signo de otro valor. |
| Cos(Single) |
Calcula el coseno de un valor. |
| Cosh(Single) |
Calcula el coseno hiperbólico de un valor. |
| CosPi(Single) |
Calcula el coseno de un valor que ha sido multipledado por |
| CreateChecked<TOther>(TOther) |
Crea una instancia del tipo actual a partir de un valor, iniciando una excepción de desbordamiento para los valores que se encuentran fuera del intervalo que se puede representar del tipo actual. |
| CreateSaturating<TOther>(TOther) |
Crea una instancia del tipo actual a partir de un valor, saturando los valores que se encuentran fuera del intervalo que se puede representar del tipo actual. |
| CreateTruncating<TOther>(TOther) |
Crea una instancia del tipo actual a partir de un valor, truncando los valores que se encuentran fuera del intervalo que se puede representar del tipo actual. |
| DegreesToRadians(Single) |
Convierte un valor determinado de grados a radianes. |
| Equals(Object) |
Devuelve un valor que indica si esta instancia es igual a un objeto especificado. |
| Equals(Single) |
Devuelve un valor que indica si esta instancia y un objeto especificado Single representan el mismo valor. |
| Exp(Single) |
|
| Exp10(Single) |
|
| Exp10M1(Single) |
|
| Exp2(Single) |
|
| Exp2M1(Single) |
|
| ExpM1(Single) |
|
| Floor(Single) |
Calcula el piso de un valor. |
| FusedMultiplyAdd(Single, Single, Single) |
Calcula la multiplicación fusionada de tres valores. |
| GetHashCode() |
Devuelve el código hash de esta instancia. |
| GetTypeCode() | |
| Hypot(Single, Single) |
Calcula la hipotenusa dadas dos valores que representan las longitudes de los lados más cortos en un triángulo con ángulo derecho. |
| Ieee754Remainder(Single, Single) |
Calcula el resto de dos valores especificados por IEEE 754. |
| ILogB(Single) |
Calcula el logaritmo entero de un valor. |
| IsEvenInteger(Single) |
Determina si un valor representa un número entero par. |
| IsFinite(Single) |
Determina si el valor especificado es finito (cero, subnormal o normal). |
| IsInfinity(Single) |
Devuelve un valor que indica si el número especificado se evalúa como infinito negativo o positivo. |
| IsInteger(Single) |
Determina si un valor representa un valor entero. |
| IsNaN(Single) |
Devuelve un valor que indica si el valor especificado no es un número (NaN). |
| IsNegative(Single) |
Determina si el valor especificado es negativo. |
| IsNegativeInfinity(Single) |
Devuelve un valor que indica si el número especificado se evalúa como infinito negativo. |
| IsNormal(Single) |
Determina si el valor especificado es normal. |
| IsOddInteger(Single) |
Determina si un valor representa un número entero impar. |
| IsPositive(Single) |
Determina si un valor es positivo. |
| IsPositiveInfinity(Single) |
Devuelve un valor que indica si el número especificado se evalúa como infinito positivo. |
| IsPow2(Single) |
Determina si un valor es una potencia de dos. |
| IsRealNumber(Single) |
Determina si un valor representa un número real. |
| IsSubnormal(Single) |
Determina si el valor especificado es subnormal. |
| Lerp(Single, Single, Single) |
Realiza una interpolación lineal entre dos valores en función del peso especificado. |
| Log(Single, Single) |
Calcula el logaritmo de un valor en la base especificada. |
| Log(Single) |
Calcula el logaritmo natural ( |
| Log10(Single) |
Calcula el logaritmo base-10 de un valor. |
| Log10P1(Single) |
Calcula el logaritmo base-10 de un valor más uno. |
| Log2(Single) |
Calcula el registro2 de un valor. |
| Log2P1(Single) |
Calcula el logaritmo base-2 de un valor más uno. |
| LogP1(Single) |
Calcula el logaritmo natural ( |
| Max(Single, Single) |
Compara dos valores con el proceso, que es mayor. |
| MaxMagnitude(Single, Single) |
Compara dos valores con el proceso, que es mayor. |
| MaxMagnitudeNumber(Single, Single) |
Compara dos valores con el proceso que tiene la magnitud mayor y devuelve el otro valor si una entrada es |
| MaxNative(Single, Single) |
Compara dos valores con el proceso, que es mayor mediante el comportamiento específico de la plataforma para |
| MaxNumber(Single, Single) |
Compara dos valores con el proceso, que es mayor y devuelve el otro valor si una entrada es |
| Min(Single, Single) |
Compara dos valores con el proceso, que es menor. |
| MinMagnitude(Single, Single) |
Compara dos valores con el proceso, que es menor. |
| MinMagnitudeNumber(Single, Single) |
Compara dos valores con el proceso que tiene la magnitud menor y devuelve el otro valor si una entrada es |
| MinNative(Single, Single) |
Compara dos valores con el proceso, que es menor mediante el comportamiento específico de la plataforma para |
| MinNumber(Single, Single) |
Compara dos valores con el proceso, que es menor y devuelve el otro valor si una entrada es |
| MultiplyAddEstimate(Single, Single, Single) |
Calcula una estimación de ( |
| Parse(ReadOnlySpan<Byte>, IFormatProvider) |
Analiza un intervalo de caracteres UTF-8 en un valor. |
| Parse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider) |
Analiza un intervalo de caracteres UTF-8 en un valor. |
| Parse(ReadOnlySpan<Char>, IFormatProvider) |
Analiza un intervalo de caracteres en un valor. |
| Parse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider) |
Convierte un intervalo de caracteres que contiene la representación de cadena de un número en un estilo especificado y un formato específico de la referencia cultural a su número de punto flotante de precisión sencilla equivalente. |
| Parse(String, IFormatProvider) |
Convierte la representación de cadena de un número en un formato específico de la referencia cultural especificado en su número de punto flotante de precisión sencilla equivalente. |
| Parse(String, NumberStyles, IFormatProvider) |
Convierte la representación de cadena de un número en un estilo y formato específico de la referencia cultural especificados en su número de punto flotante de precisión sencilla equivalente. |
| Parse(String, NumberStyles) |
Convierte la representación de cadena de un número en un estilo especificado en su número de punto flotante de precisión sencilla equivalente. |
| Parse(String) |
Convierte la representación de cadena de un número en su número de punto flotante de precisión sencilla equivalente. |
| Pow(Single, Single) |
Calcula un valor elevado a una potencia determinada. |
| RadiansToDegrees(Single) |
Convierte un valor determinado de radianes en grados. |
| ReciprocalEstimate(Single) |
Calcula una estimación de la recíproca de un valor. |
| ReciprocalSqrtEstimate(Single) |
Calcula una estimación de la raíz cuadrada recíproca de un valor. |
| RootN(Single, Int32) |
Calcula la n-ª raíz de un valor. |
| Round(Single, Int32, MidpointRounding) |
Redondea un valor a un número especificado de dígitos fraccionarios mediante el modo de redondeo predeterminado (ToEven). |
| Round(Single, Int32) |
Redondea un valor a un número especificado de dígitos fraccionarios mediante el modo de redondeo predeterminado (ToEven). |
| Round(Single, MidpointRounding) |
Redondea un valor al entero más cercano mediante el modo de redondeo especificado. |
| Round(Single) |
Redondea un valor al entero más cercano mediante el modo de redondeo predeterminado (ToEven). |
| ScaleB(Single, Int32) |
Calcula el producto de un valor y su base-radix elevado a la potencia especificada. |
| Sign(Single) |
Calcula el signo de un valor. |
| Sin(Single) |
Calcula el seno de un valor. |
| SinCos(Single) |
Calcula el seno y el coseno de un valor. |
| SinCosPi(Single) |
Calcula el seno y el coseno de un valor. |
| Sinh(Single) |
Calcula el seno hiperbólico de un valor. |
| SinPi(Single) |
Calcula el seno de un valor multiplicado por |
| Sqrt(Single) |
Calcula la raíz cuadrada de un valor. |
| Tan(Single) |
Calcula la tangente de un valor. |
| Tanh(Single) |
Calcula la tangente hiperbólica de un valor. |
| TanPi(Single) |
Calcula la tangente de un valor que ha sido multipledado por |
| ToString() |
Convierte el valor numérico de esta instancia en su representación de cadena equivalente. |
| ToString(IFormatProvider) |
Convierte el valor numérico de esta instancia en su representación de cadena equivalente mediante la información de formato específica de la referencia cultural especificada. |
| ToString(String, IFormatProvider) |
Convierte el valor numérico de esta instancia en su representación de cadena equivalente mediante el formato especificado y la información de formato específica de la referencia cultural. |
| ToString(String) |
Convierte el valor numérico de esta instancia en su representación de cadena equivalente mediante el formato especificado. |
| Truncate(Single) |
Trunca un valor. |
| TryFormat(Span<Byte>, Int32, ReadOnlySpan<Char>, IFormatProvider) |
Intenta dar formato al valor de la instancia actual como UTF-8 en el intervalo de bytes proporcionado. |
| TryFormat(Span<Char>, Int32, ReadOnlySpan<Char>, IFormatProvider) |
Intenta dar formato al valor de la instancia de número flotante actual en el intervalo de caracteres proporcionado. |
| TryParse(ReadOnlySpan<Byte>, IFormatProvider, Single) |
Intenta analizar un intervalo de caracteres UTF-8 en un valor. |
| TryParse(ReadOnlySpan<Byte>, NumberStyles, IFormatProvider, Single) |
Intenta analizar un intervalo de caracteres UTF-8 en un valor. |
| TryParse(ReadOnlySpan<Byte>, Single) |
Intenta convertir un intervalo de caracteres UTF-8 que contiene la representación de cadena de un número en su número de punto flotante de precisión sencilla equivalente. |
| TryParse(ReadOnlySpan<Char>, IFormatProvider, Single) |
Intenta analizar un intervalo de caracteres en un valor. |
| TryParse(ReadOnlySpan<Char>, NumberStyles, IFormatProvider, Single) |
Convierte la representación de intervalo de un número en un estilo y formato específico de la referencia cultural especificados en su número de punto flotante de precisión sencilla equivalente. Un valor devuelto indica si la conversión se realizó correctamente o no. |
| TryParse(ReadOnlySpan<Char>, Single) |
Convierte la representación de cadena de un número en un intervalo de caracteres en su número de punto flotante de precisión sencilla equivalente. Un valor devuelto indica si la conversión se realizó correctamente o no. |
| TryParse(String, IFormatProvider, Single) |
Intenta analizar una cadena en un valor. |
| TryParse(String, NumberStyles, IFormatProvider, Single) |
Convierte la representación de cadena de un número en un estilo y formato específico de la referencia cultural especificados en su número de punto flotante de precisión sencilla equivalente. Un valor devuelto indica si la conversión se realizó correctamente o no. |
| TryParse(String, Single) |
Convierte la representación de cadena de un número en su número de punto flotante de precisión sencilla equivalente. Un valor devuelto indica si la conversión se realizó correctamente o no. |
Operadores
| Nombre | Description |
|---|---|
| Equality(Single, Single) |
Devuelve un valor que indica si dos valores especificados Single son iguales. |
| GreaterThan(Single, Single) |
Devuelve un valor que indica si un valor especificado Single es mayor que otro valor especificado Single . |
| GreaterThanOrEqual(Single, Single) |
Devuelve un valor que indica si un valor especificado Single es mayor o igual que otro valor especificado Single . |
| Inequality(Single, Single) |
Devuelve un valor que indica si dos valores especificados Single no son iguales. |
| LessThan(Single, Single) |
Devuelve un valor que indica si un valor especificado Single es menor que otro valor especificado Single . |
| LessThanOrEqual(Single, Single) |
Devuelve un valor que indica si un valor especificado Single es menor o igual que otro valor especificado Single . |
Implementaciones de interfaz explícitas
| Nombre | Description |
|---|---|
| IAdditionOperators<Single,Single,Single>.Addition(Single, Single) |
Agrega dos valores juntos para calcular su suma. |
| IAdditiveIdentity<Single,Single>.AdditiveIdentity |
Obtiene la identidad de suma del tipo actual. |
| IBinaryNumber<Single>.AllBitsSet |
Obtiene una instancia del tipo binario en el que se establecen todos los bits. |
| IBitwiseOperators<Single,Single,Single>.BitwiseAnd(Single, Single) |
Calcula los valores bit a bit y de dos valores. |
| IBitwiseOperators<Single,Single,Single>.BitwiseOr(Single, Single) |
Calcula el bit a bit o de dos valores. |
| IBitwiseOperators<Single,Single,Single>.ExclusiveOr(Single, Single) |
Calcula el valor exclusivo o de dos valores. |
| IBitwiseOperators<Single,Single,Single>.OnesComplement(Single) |
Calcula la representación ones-complement de un valor determinado. |
| IComparable.CompareTo(Object) |
Compara la instancia actual con otro objeto del mismo tipo y devuelve un entero que indica si la instancia actual precede, sigue o se produce en la misma posición en el criterio de ordenación que el otro objeto. |
| IConvertible.GetTypeCode() |
Devuelve para TypeCode esta instancia. |
| IConvertible.ToBoolean(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToBoolean(IFormatProvider). |
| IConvertible.ToByte(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToByte(IFormatProvider). |
| IConvertible.ToChar(IFormatProvider) |
Esta conversión no se admite. Si se intenta usar este método, se produce una InvalidCastExceptionexcepción . |
| IConvertible.ToDateTime(IFormatProvider) |
Esta conversión no se admite. Si se intenta usar este método, se produce una InvalidCastExceptionexcepción . |
| IConvertible.ToDecimal(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToDecimal(IFormatProvider). |
| IConvertible.ToDouble(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToDouble(IFormatProvider). |
| IConvertible.ToInt16(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToInt16(IFormatProvider). |
| IConvertible.ToInt32(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToInt32(IFormatProvider). |
| IConvertible.ToInt64(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToInt64(IFormatProvider). |
| IConvertible.ToSByte(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToSByte(IFormatProvider). |
| IConvertible.ToSingle(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToSingle(IFormatProvider). |
| IConvertible.ToType(Type, IFormatProvider) |
Para obtener una descripción de este miembro, vea ToType(Type, IFormatProvider). |
| IConvertible.ToUInt16(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToUInt16(IFormatProvider). |
| IConvertible.ToUInt32(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToUInt32(IFormatProvider). |
| IConvertible.ToUInt64(IFormatProvider) |
Para obtener una descripción de este miembro, vea ToUInt64(IFormatProvider). |
| IDecrementOperators<Single>.Decrement(Single) |
Disminuye un valor. |
| IDivisionOperators<Single,Single,Single>.Division(Single, Single) |
Divide un valor por otro para calcular su cociente. |
| IFloatingPoint<Single>.GetExponentByteCount() |
Obtiene el número de bytes que se escribirán como parte de TryWriteExponentLittleEndian(Span<Byte>, Int32). |
| IFloatingPoint<Single>.GetExponentShortestBitLength() |
Obtiene la longitud, en bits, de la representación complementaria de dos más corta del exponente actual. |
| IFloatingPoint<Single>.GetSignificandBitLength() |
Obtiene la longitud, en bits, del significado actual. |
| IFloatingPoint<Single>.GetSignificandByteCount() |
Obtiene el número de bytes que se escribirán como parte de TryWriteSignificandLittleEndian(Span<Byte>, Int32). |
| IFloatingPoint<Single>.TryWriteExponentBigEndian(Span<Byte>, Int32) |
Intenta escribir el exponente actual, en formato big-endian, en un intervalo determinado. |
| IFloatingPoint<Single>.TryWriteExponentLittleEndian(Span<Byte>, Int32) |
Intenta escribir el exponente actual, en formato little-endian, en un intervalo determinado. |
| IFloatingPoint<Single>.TryWriteSignificandBigEndian(Span<Byte>, Int32) |
Intenta escribir el significado actual, en formato big-endian, en un intervalo determinado. |
| IFloatingPoint<Single>.TryWriteSignificandLittleEndian(Span<Byte>, Int32) |
Intenta escribir el significado actual, en formato little-endian, en un intervalo determinado. |
| IFloatingPointConstants<Single>.E |
Obtiene la constante |
| IFloatingPointConstants<Single>.Pi |
Obtiene la constante |
| IFloatingPointConstants<Single>.Tau |
Obtiene la constante |
| IFloatingPointIeee754<Single>.Epsilon |
Obtiene el valor más pequeño, de modo que se puede agregar a |
| IFloatingPointIeee754<Single>.NaN |
Obtiene un valor que representa |
| IFloatingPointIeee754<Single>.NegativeInfinity |
Obtiene un valor que representa un valor negativo |
| IFloatingPointIeee754<Single>.NegativeZero |
Obtiene un valor que representa un valor negativo |
| IFloatingPointIeee754<Single>.PositiveInfinity |
Obtiene un valor que representa un valor positivo |
| IIncrementOperators<Single>.Increment(Single) |
Incrementa un valor. |
| IMinMaxValue<Single>.MaxValue |
Obtiene el valor máximo del tipo actual. |
| IMinMaxValue<Single>.MinValue |
Obtiene el valor mínimo del tipo actual. |
| IModulusOperators<Single,Single,Single>.Modulus(Single, Single) |
Divide dos valores juntos para calcular su módulo o resto. |
| IMultiplicativeIdentity<Single,Single>.MultiplicativeIdentity |
Obtiene la identidad multiplicativa del tipo actual. |
| IMultiplyOperators<Single,Single,Single>.Multiply(Single, Single) |
Multiplica dos valores juntos para calcular su producto. |
| INumberBase<Single>.IsCanonical(Single) |
Determina si un valor está en su representación canónica. |
| INumberBase<Single>.IsComplexNumber(Single) |
Determina si un valor representa un número complejo. |
| INumberBase<Single>.IsImaginaryNumber(Single) |
Determina si un valor representa un número imaginario puro. |
| INumberBase<Single>.IsZero(Single) |
Determina si un valor es cero. |
| INumberBase<Single>.One |
Obtiene el valor |
| INumberBase<Single>.Radix |
Obtiene la raíz, o base, para el tipo. |
| INumberBase<Single>.TryConvertFromChecked<TOther>(TOther, Single) |
Representa un número de punto flotante de precisión sencilla. |
| INumberBase<Single>.TryConvertFromSaturating<TOther>(TOther, Single) |
Representa un número de punto flotante de precisión sencilla. |
| INumberBase<Single>.TryConvertFromTruncating<TOther>(TOther, Single) |
Representa un número de punto flotante de precisión sencilla. |
| INumberBase<Single>.TryConvertToChecked<TOther>(Single, TOther) |
Intenta convertir una instancia del tipo actual en otro tipo, iniciando una excepción de desbordamiento para los valores que se encuentran fuera del intervalo que se puede representar del tipo actual. |
| INumberBase<Single>.TryConvertToSaturating<TOther>(Single, TOther) |
Intenta convertir una instancia del tipo actual en otro tipo, saturando los valores que se encuentran fuera del intervalo que se puede representar del tipo actual. |
| INumberBase<Single>.TryConvertToTruncating<TOther>(Single, TOther) |
Intenta convertir una instancia del tipo actual en otro tipo, truncando los valores que se encuentran fuera del intervalo que se puede representar del tipo actual. |
| INumberBase<Single>.Zero |
Obtiene el valor |
| ISignedNumber<Single>.NegativeOne |
Obtiene el valor |
| ISubtractionOperators<Single,Single,Single>.Subtraction(Single, Single) |
Resta dos valores para calcular su diferencia. |
| IUnaryNegationOperators<Single,Single>.UnaryNegation(Single) |
Calcula la negación unaria de un valor. |
| IUnaryPlusOperators<Single,Single>.UnaryPlus(Single) |
Calcula la unaria más de un valor. |
Se aplica a
Seguridad para subprocesos
Todos los miembros de este tipo son seguros para subprocesos. Los miembros que parecen modificar el estado de instancia devuelven realmente una nueva instancia inicializada con el nuevo valor. Al igual que con cualquier otro tipo, leer y escribir en una variable compartida que contenga una instancia de este tipo debe estar protegida por un bloqueo para garantizar la seguridad de los subprocesos.