gpt4 book ai didi

c# - 转换 float -> double -> float

转载 作者:太空狗 更新时间:2023-10-30 01:03:21 25 4
gpt4 key购买 nike

是否可以将 float 转换为 double,然后返回而不丢失精度?我的意思是第一个 float 应该与结果 float 完全相同。

最佳答案

是的,我们可以测试它:

float fl = float.NegativeInfinity;

long cycles = 0;

while (true)
{
double dbl = fl;
float fl2 = (float)dbl;

int flToInt1 = new Ieee754.Int32SingleConverter { Single = fl }.Int32;
int flToInt2 = new Ieee754.Int32SingleConverter { Single = fl2 }.Int32;

if (flToInt1 != flToInt2)
{
Console.WriteLine("\nDifferent: {0} (Int32: {1}, {2})", fl, flToInt1, flToInt2);
}

if (fl == 0)
{
Console.WriteLine("\n0, Sign: {0}", flToInt1 < 0 ? "-" : "+");
}

if (fl == float.PositiveInfinity)
{
fl = float.NaN;
}
else if (float.IsNaN(fl))
{
break;
}
else
{
fl = Ieee754.NextSingle(fl);
}

cycles++;

if (cycles % 100000000 == 0)
{
Console.Write(".");
}
}

Console.WriteLine("\nDone");
Console.ReadKey();

和实用类:

public static class Ieee754
{
[StructLayout(LayoutKind.Explicit)]
public struct Int32SingleConverter
{
[FieldOffset(0)]
public int Int32;

[FieldOffset(0)]
public float Single;
}

public static float NextSingle(float value)
{
int bits = new Int32SingleConverter { Single = value }.Int32;

if (bits >= 0)
{
bits++;
}
else if (bits != int.MinValue)
{
bits--;
}
else
{
bits = 0;
}

return new Int32SingleConverter { Int32 = bits }.Single;
}
}

在我的电脑上,在 Release模式下,没有调试器(Visual Studio 中的 Ctrl+F5),大约需要 2 分钟。

大约有 40 亿个不同的 float 值。我将它们转换并将它们转换为 int 以对它们进行二进制检查。请注意,NaN 值是“特定的”。 IEEE754 标准有多个 NaN 值,但 .NET 将它们“压缩”为单个 NaN 值。因此,您可以创建一个 NaN 值(通过位操作手动),该值无法正确来回转换。 “标准”NaN 值已正确转换,PositiveInfinityNegativeInfinity+0 也是如此-0

关于c# - 转换 float -> double -> float,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29648271/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com