Julia浮点运算的解决方法?

sta*_*ark 2 floating-point julia

是有可能的解决方法,以Julia的浮点和舍入运算,其特征在于它输出即使是简单的值,例如1.61.6000000000000012

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

Phi*_*lip 7

发表评论作为答案...请参阅Julia中的精确十进制算术,并可能使用BigFloatRational之一 ; 使用前者如果你只需要你的花车精度到"至少N个小数位",其中N取决于你; 如果一个任意且有限的小错误仍然打破了你正在做的事情,那么使用后者.

如果您使用BigFloat,您可能希望手动初始化文字值:

请注意,因为在解析时十进制文字转换为浮点数,BigFloat(2.1)可能无法产生您期望的结果.您可能更喜欢通过parse()或使用大字符串文字来初始化字符串中的常量.

julia> BigFloat(2.1)2.100000000000000088817841970012523233890533447265625000000000000000000000000000

julia> big"2.1"2.09999999999999999999999999999999999999999999999999999999999999999999999999999986


nic*_*y12 7

在Julia中,您可以使用Rational类型来表示有理数而不会丢失精度.请参阅此处的文档.但是,你仍然需要非常小心你的计算不提倡RationalReal.

您的示例1.6可以表示如下:

> x = 16//10
8//5
Run Code Online (Sandbox Code Playgroud)

然后朱莉娅会记住分母和分子并将值存储起来.您可以使用这些有理数来将您的派生值与真实值进行比较.

如果最后你需要转换回浮点数(因为例如你的结果是无理的),你可以使用BigFloat类型来获得更高的精度.Rational即使使用BigFloats以下数字,数字也可以提高精度:

> @printf "%.100f" BigFloat(1.6 - 1.5)
0.1000000000000000888178419700125232338905334472656250000000000000000000000000000000000000000000000000

> @printf "%.100f" BigFloat(16//10 - 15//10)
0.1000000000000000000000000000000000000000000000000000000000000000000000000000002159042138773611156347
Run Code Online (Sandbox Code Playgroud)