在C#:.NET double和python float有什么区别?
Console.WriteLine(1.2d - 1.0d);
产生0.2
。在python 3中:
print(1.2 - 1.0)
产生0.19999999999999996
。
我的目标是在C#中编写与python 3产生相同浮点结果的快速代码。我显然对任何和所有浮点运算都感兴趣,而不仅仅是上面的例子。
什么是最实际的方法来实现呢?有我可以使用的图书馆吗?
另外,我想了解,究竟是什么导致了这种差异。两种表示都是64位,并且都是基于IEEE。那么这些实现有什么不同,使它们产生不同的结果?
参考文献:
- 15. Floating Point Arithmetic: Issues and Limitations
- Why are floating-point calculations so inaccurate?
- Real literals
- What Every Computer Scientist Should Know About Floating-Point Arithmetic
- IEEE Floats and Python
我建议你首先查看结果的按位表示,而不是字符串表示 - 直到你做完这些之后,没有证据表明减法结果实际上是任何不同的。但是您还需要明白,在C#中,JIT编译器允许在某些算术中使用更精确的表示形式,例如在执行多个64位操作时使用80位中间结果。如果你想在平台之间进行位兼容的算术,那将是棘手的。 –
@JonSkeet,谢谢,这是个坏消息;( –
FWIW,在Python 2中'0.2'被打印出来,但它的底层位模式相同,可以用'd = 1.2-1.0; print(format(d ,'0.60f'))''在两个版本中都打印出0.199999999999999955591079014993738383054733276367187500000000'。 –