问题标签 [floating-accuracy]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
502 浏览

perl - 如何解决导致 Perl 的 Statistics::Descriptive 中的无限循环的舍入错误?

我正在使用 Perl 中的Statistics::Descriptive库来计算频率分布并遇到浮点舍入误差问题。

我将两个值 0.205 和 0.205(取自其他数字并 sprintf'd 到那些)传递给 stats 模块并要求它计算频率分布,但它陷入了无限循环。

使用调试器单步执行,我可以看到它正在执行以下操作:

$self->sample_range (范围是 max-min)返回 2.77555756156289e-17 而不是我期望的 0。这意味着循环 ((min+=range) < max)) 进入(出于所有意图和目的)无限循环。

DB<8> 打印 $self->{max};
0.205
DB<9> 打印 $self->{min};
0.205
DB<10> 打印 $self->{max}-$self->{min};
2.77555756156289e-17

所以这看起来像一个舍入问题。不过,我想不出如何解决这个问题,而且我不确定编辑库是个好主意。我正在寻找解决方法或替代方法的建议。

干杯,尼尔

0 投票
9 回答
27312 浏览

java - 舍入错误?

在我的课程中,有人告诉我:

连续值在内存中近似表示,因此使用浮点数进行计算涉及舍入误差。这些是位模式的微小差异;因此,如果和是浮动的,测试e==f是不安全的。ef

参考Java。

这是真的?我使用doubles 和floats 的比较语句并且从未遇到过舍入问题。我从来没有在教科书中读过类似的东西。虚拟机肯定会解决这个问题吗?

0 投票
10 回答
1703 浏览

javascript - 1.265 * 10000 = 126499.99999999999?

当我将 1.265 乘以 10000 时,我在使用 Javascript 时得到 126499.99999999999。

为什么会这样?

0 投票
17 回答
76152 浏览

c++ - 如何在 C++ 中做一个整数 log2()?

在 C++ 标准库中,我发现只有一个浮点日志方法。现在我使用 log 来查找二叉树 ( floor(2log(index))) 中索引的级别。

代码(C++):

恐怕对于某些边缘元素(值为 2^n 的元素),log 将返回 n-1.999999999999 而不是 n.0。这种恐惧正确吗?如何修改我的陈述以使其始终返回正确答案?

0 投票
6 回答
990 浏览

precision - 具有无限精度的数学库是如何实现的?

所以我知道浮点精度(以及 1.1 之类的东西如何不能用二进制精确表示)等等,但我想知道:那么,与数学相关的库如何实现无限精度?换句话说,例如,您将如何以二进制形式准确地表示 1.1?只是一个简短的描述会很棒,我可以自己弄清楚确切的细节。谢谢。:)

0 投票
2 回答
6057 浏览

php - PHP/MySQL:最佳货币操作/存储实践?

所以,我打算做一个处理钱的应用程序(PHP/MySQL),我正在考虑如何存储和操作钱,参考PHP浮点数据类型和MySQL十进制。

我在想两个选择。其中之一是以整数美分格式($dollars * 100)操作和存储货币,以便不处理浮点不精确并将其也作为整数存储在数据库中。另一种是以十进制形式存储在 DB 中,并在 PHP 中使用 BC Math 进行计算。

所以我整晚都在谷歌上搜索哪个是最好的选择,但没有找到明确的答案。我见过的唯一合理的选择是整数美分(我不太喜欢,因为它意味着在浏览器中的每次显示之前和存储在数据库中之前从美元转换为美分,反之亦然)。

此外,人们抱怨 MySQL 小数(MySQL 将小数存储为字符串,将它们操作为浮点数等),但那是旧帖子。根据 MySQL 文档,当前版本正确处理小数,唯一的抱怨是它截断了超过声明的小数长度的值的小数部分(例如,如果您将值 12.326 存储在声明为小数的列中(9,2)) ,但根据我的调查,它会舍入它而不是截断(12.326 变为 12.33),这在我看来是正确的。

而且,我没有找到任何关于将钱存储为小数并使用 PHP BCMath 进行计算的建议,在我看来,这是因为很少有人知道 BC 和 GMP 数学函数。

那么,考虑到精度、速度(BCMath 计算速度、MySQL 十进制速度与整数)和编程舒适度,最好的选择是什么?

0 投票
21 回答
176547 浏览

java - 在 Java 中使用 == 比较浮点数有什么问题?

根据这个 java.sun 页面 ==是 Java 中浮点数的相等比较运算符。

但是,当我键入此代码时:

进入我的编辑器并运行静态分析,我得到:“JAVA0078 浮点值与 == 相比

使用==比较浮点值有什么问题?正确的方法是什么? 

0 投票
2 回答
254 浏览

.net - 浮点等价?

我希望能够比较两个双打而不考虑可能的精度损失。是否已经有一种方法可以处理这种情况?

如果没有,是否有一个阈值/指南来知道两个双打之间的充分等效性是多少?

0 投票
11 回答
20508 浏览

c - C中的纬度/经度存储和压缩

有谁知道纬度/经度坐标的最有效表示?对于消费类 GPS 设备,精度级别应该足够了。

大多数实现似乎都double用于每个单元,但我怀疑一个float或定点格式应该足够了。我很想知道任何尝试压缩和/或存储这些值的大型数组的人的来信。

编辑:

换句话说,代表消费级设备的纬度/经度所需的最低准确度是多少?

0 投票
10 回答
15488 浏览

c++ - C ++中的for循环使用双提前一步突破,未达到边界值

我有一个在 32 位 Ubuntu 8.04 上使用 gcc 4.2.4 编译的简单 C++ 程序。它有一个for循环,其中一个double变量以一定的步长从零递增到一。当步长为0.1时,行为是我所期望的。但是当步长为 '0.05' 时,循环在0.95. 谁能告诉我为什么会这样?输出遵循下面的源代码。

输出