对于Julia的浮点和舍入算法是否有可能的解决方法,它甚至输出一个简单的值,例如1.6
为1.6000000000000012
由于我打算使用Julia来证明正交方法的精确程度,我需要最终证明积分的计算值等于其精确值,但由于在某些情况下尾随小数的这些差异,我无法这样做。
答案 0 :(得分:7)
发表评论作为答案...请参阅Exact decimal arithmetic in Julia,并可能使用BigFloat或Rational之一;使用前者如果你只需要你的花车精度到"至少 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的经验,但通常有一种以上的数字类型可供编程语言使用。也许存在可以使用的任意精度浮点库。