处理浮点数

时间:2009-09-14 04:50:33

标签: floating-point

我正在尝试使用Google Code Jam,并且有一个问题是使用了双重值......

我很难用C编码,在某些情况下我的答案总是与实际答案有所不同......

我想知道的是哪种语言具有最佳的浮点实现和处理?

这已经发生了很多次,我觉得是时候切换到更好地处理花车的语言了。有什么想法吗?

4 个答案:

答案 0 :(得分:7)

如今,各种语言的浮点几乎相同,因为几乎普遍使用IEEE 754

因此,您可能需要更好地了解浮点数,例如阅读David Goldberg撰写的What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:4)

IEEE 754指定了关于浮点数的“你需要知道的一切”。这与编译器/硬件所涉及的问题或编程语言无关。

如果您想要精确非整数,则需要使用诸如.NETPythonJava提供的Decimal类,实例

答案 2 :(得分:3)

几乎所有语言中的fp都被委托给硬件。进行浮点计算既昂贵又有用,因此几乎所有现代处理器都具有某种内置逻辑用于这些计算。语言重新发明这个特定的轮子将是非常愚蠢的。

话虽这么说,你可以做一些事情,这取决于你想要的FP计算。如果您需要通常在双精度硬件上可用的更高精度,您可以使用一些重新发明轮子的库,可能是因为您必须解决一个特别恶劣的条件方程组,例如,GMP提供了许多数字具有任意精度的格式。这将比硬件FP慢一个数量级,但也许你需要它。

如果你遇到1.0 / 10.0 == 10.000000002问题,可能是因为你试图操纵货币,那么你需要以不同的方式进行计算,例如许多语言提供了一个特殊的数字类只是为了工作大多数会计师都会想到的十进制数字。您也可以使用上面提到的bignum库。

如果您需要更多的计算资源,现代GPU配备了数十或数百个fp内核,现在提供了一些非常方便的API来访问它们。您可能需要查看OpenCL,它为这种解决方案提供了可移植的抽象。

答案 3 :(得分:1)

  

我想知道的是哪种语言具有最佳的浮点实现和处理?

Fortran或汇编程序;许多其他人没有标准化的机制来访问所有类型(80位实数等)和处理器舍入模式(通常也可以作为C中的编译器扩展)。

但是,浮点不是无限精确的,多个精度值可能需要无限空间来表示某些值。

某些表达式的另一种方法是方案或其他支持有理数的lisp系列语言 - 所以1/3表示为存储整数1和整数3。

如果您使用Java中的双精度和C中的双精度比较结果,那么您应该阅读Java规范并设置C环境以使用相同的舍入模式和算法; java.lang.Math触发器函数基于netlib而不是C标准库。

还要记住(你应该在学校教过什么),如果你的输入只给了一定数量的有效数字,那么就不要把结果报告给比你更重要的数字。