Floating point 朱莉娅的变通办法';什么是浮点运算?

Floating point 朱莉娅的变通办法';什么是浮点运算?,floating-point,julia,Floating Point,Julia,Julia的浮点和四舍五入算法是否有一种可能的解决方法,它甚至可以输出一个简单的值,例如1.6为1.600000000000012 因为我打算用Julia来证明求积法的精确程度,我需要最终证明一个积分的计算值等于它的精确值,但在某些情况下,由于尾随小数的差异,我不能这样做。这是浮点数存储为固定的有限位数(通常为32或64位)这一事实的产物,它不能以无限精度表示任意数量。特别是,由于它们使用基数2表示法,因此可以在基数10中精确表示的数量(如1.6)可能无法在基数2中精确表示,反之亦然。你必须在证

Julia的浮点和四舍五入算法是否有一种可能的解决方法,它甚至可以输出一个简单的值,例如
1.6
1.600000000000012


因为我打算用Julia来证明求积法的精确程度,我需要最终证明一个积分的计算值等于它的精确值,但在某些情况下,由于尾随小数的差异,我不能这样做。

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


我没有julia的具体经验,但通常一种编程语言可以使用不止一种数值类型。可能存在可以使用的任意精度浮点库。

将注释作为答案发布…请参阅并可能使用或中的一个;如果您只需要浮点数的精度达到“至少N小数位”,其中N由您决定,请使用前者;如果一个任意且有界的小错误仍然破坏了您正在做的事情,请使用后者

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

请注意,因为十进制文字被转换为浮点 当解析数字时,BigFloat(2.1)可能不会产生您所期望的结果。你 可能更喜欢通过parse()从字符串初始化常量, 或者使用大字符串文本

julia>BigFloat(2.1) 2.1000000000000088817841970012523233890533447265625000000000000000000000000000000000000

朱莉娅>大“2.1” 2.0999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999986


在Julia中,您可以使用
Rational
类型来表示有理数,而不会丢失精度。见文件。 但是,您仍然需要非常小心地进行计算,不要将
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

看到了吗?如果有任何不精确性,即使在一个任意紧密的边界内,是不可容忍的,那么你也需要看到“斯塔克”,只是好奇,如果你发现你用过的其他语言有什么不同的话?如果是这样的话,很可能该语言只是对您隐藏了额外的小数点。(一个例外可能是(也可能不是)Mathematica,我相信它广泛使用有理数。)