Julia浮点运算的解决方法?

时间:2016-04-04 19:40:43

标签: floating-point julia

对于Julia的浮点和舍入算法是否有可能的解决方法,它甚至输出一个简单的值,例如1.61.6000000000000012

由于我打算使用Julia来证明正交方法的精确程度,我需要最终证明积分的计算值等于其精确值,但由于在某些情况下尾随小数的这些差异,我无法这样做。

3 个答案:

答案 0 :(得分:7)

发表评论作为答案...请参阅Exact decimal arithmetic in Julia,并可能使用BigFloatRational之一;使用前者如果你只需要你的花车精度到"至少 N 小数位" N 取决于您;如果任意且有限的小错误仍然会破坏您正在做的事情,请使用后者。

如果您使用BigFloat,则可能需要手动初始化文字值:

  

请注意,因为十进制文字转换为浮点数   解析后的数字,BigFloat(2.1)可能无法满足您的期望。您   可能更喜欢通过parse()从字符串初始化常量,   或使用大字符串文字。

     

朱莉娅> BigFloat(2.1)   2.100000000000000088817841970012523233890533447265625000000000000000000000000000

     

朱莉娅>大" 2.1"   2.099999999999999999999999999999999999999999999999999999999999999999999999999986

答案 1 :(得分:7)

在Julia中,您可以使用Rational类型来表示有理数而不会丢失精度。请参阅文档here。 但是,您仍需要非常小心计算,不要将Rational提升为Real

1.6的示例可以表示如下:

> x = 16//10
8//5
然后朱莉娅会记住分母和分子并将值存储起来。您可以使用这些有理数来将您的派生值与真实值进行比较。

如果最后你需要转换回浮点数(因为你的结果是不合理的),你可以使用BigFloat类型来获得更高的精度。即使使用Rational

BigFloats数字也可以帮助您提高精确度
> @printf "%.100f" BigFloat(1.6 - 1.5)
0.1000000000000000888178419700125232338905334472656250000000000000000000000000000000000000000000000000

> @printf "%.100f" BigFloat(16//10 - 15//10)
0.1000000000000000000000000000000000000000000000000000000000000000000000000000002159042138773611156347

答案 2 :(得分:3)

这是浮点数存储为固定的有限位数(通常为32或64)的事实,它不能表示具有无限精度的任意数量。特别是,因为它们使用基数2表示,所以可以在基数10中精确表示的数量(例如1.6)可能不能在基数2中精确表示,反之亦然。您必须在证明中考虑这个有限的精度。

我没有专门针对julia的经验,但通常有一种以上的数字类型可供编程语言使用。也许存在可以使用的任意精度浮点库。