Julia中的精确十进制算术

Jam*_*zho 7 floating-point multiplication julia

由于浮点数学的性质,.4 * .4= 0.16000000000000003朱莉娅.我希望以0.16CPU高效的方式获得数学上正确的答案.我知道round()有效,但这需要事先了解答案占用的小数位数,因此这不是一般解决方案.

Sim*_*rne 10

一些选择:

  1. 使用内置Rational类型.最准确,最快捷的方式

    16 // 100*16 // 100

如果您使用非常大的数字,这些可能会溢出,在这种情况下您可以使用BigInts代替,

big(16)//big(100) * big(16)//big(100)
Run Code Online (Sandbox Code Playgroud)

(你实际上并不需要将它们全部包装在bigs中,因为合理性会自动提升).

你也可以使用rationalize(0.16),但这可能不那么准确或有效,因为当Julia看到它时,文字0.16已经被转换为a Float64,所以你要转换为二进制浮点然后转换为a Rational.

  1. DecFP.jl包含IEEE-754十进制浮点的Intel实现.这应该相当快(虽然不如二进制效率高),但具有固定的精度,因此您必须在某个时刻进行舍入.

  2. Decimals.jl是一个"大十进制"浮点库:因为它使用任意精度算术,它将比DecFP慢.

要说哪个是最好的,需要有关您的预期用途的更多信息.

  • 请注意,DecFP.jl 也比使用内置 BigFloat 类型*更快*(由于使用不可变) (2认同)