gpt4 book ai didi

javascript - IEEE 754 float 学

转载 作者:行者123 更新时间:2023-12-02 16:39:33 29 4
gpt4 key购买 nike

使用 IEEE754 float (在 JavaScript 中)时,与数学相关的精度损失风险是什么?

10*.1

即整数乘以有理数。

最佳答案

注意:该问题经过编辑,在发布此答案后很长时间添加了“that is a divisor of”,请参阅下方的更新。

<小时/>

What is the risk of precision loss...

它是几乎有保证的,具体取决于所涉及的整数和 float ,因为我们使用的数字(以 10 为基数的小数)与实际的 IEEE-754 float 之间不匹配(以 2 为基数的小数,然后以 10 为基数表示以供我们使用)。正如我们无法以 10 为基数精确表示 10/3 一样,有各种以 10 为基数的数字也无法以 2 为基数精确存储。

但是对于您的具体问题:它在 3 处中断:3 * 0.10.30000000000000004

不过,您甚至不需要乘法,加法就足够了,经典示例是 0.1 + 0.2,这也会得到 0.30000000000000004

示例(JavaScript 数字是 IEEE-754 double 浮点):

snippet.log(0.1 + 0.2); // 0.30000000000000004
snippet.log(3 * 0.1); // Also 0.30000000000000004
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

<小时/>

关于您添加的“这是...的除数”:我认为您的意思是小数与原始整数相关,这样结果将是具有实际数学意义的整数。

不,这也不安全。 :-) 因为在实际数学中以 10 为基数的小数值可能无法在 IEEE-754 的以 10 为基数中精确表示,因此会出现不准确的情况。例如 0.00000000002,演示了这个问题:

snippet.log(200000000000 * 0.00000000002); // 3.9999999999999996
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

我不知道是否有更大的值会引入不精确性,但这不会让我感到惊讶。

关于javascript - IEEE 754 float 学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27623217/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com