问题标签 [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 投票
4 回答
241 浏览

math - 如何解决一些舍入错误?

我有一个在.NET 中处理一些地理坐标的方法,并且我有一个存储坐标对的结构,如果为其中一个坐标传入 256,则它变为 0。但是,在一个特定实例中,值为大约 255.99999998 被计算出来,因此存储在结构中。当它在 ToString() 中打印时,它变成 256,这不应该发生 - 256 应该是 0。我不介意它是否打印 255.9999998,但是当调试器显示 255.99999998 时它打印 256 是一个问题。让它同时存储和显示 0 会更好。

具体来说,比较存在问题。255.99999998 足够接近 256 以至于它应该等于它。比较双打时应该怎么做?使用某种 epsilon 值?


编辑:具体来说,我的问题是我取一个值,执行一些计算,然后对该数字执行相反的计算,我需要准确地取回原始值。

0 投票
2 回答
642 浏览

c# - 在不同的语言/架构/操作系统中取相对较小的数的对数

在Java中我运行:

输出:-0.008000042667076265

在 C# 中,我运行:<- 已修复

输出:-0.175281838(稍后在程序中打印)

谷歌声称:

输出:-0.00347437439

MacOS 声称同样的事情(google 和 Snow Leopard 之间的第一个差异大约是 10^-8,可以忽略不计。

有什么理由让这些结果变化如此之大,还是我遗漏了一些非常明显的东西?(我确实检查了 java 和 C# 都使用 base e)。即使是轻微不同的 e 值似乎也无法解释如此大的差异。有什么建议么?

编辑:

在 Wolfram Alpha 上进行验证似乎表明 Java 是正确的(或者 Wolfram Alpha 使用 Java Math 进行对数...)并且我的 C# 程序没有正确的输入,但我不愿意相信这一点,因为采用 (e^ (谷歌结果) - 249/251)给了我一个 0.0044 的错误,在我看来这是相当大的,这表明手头有一个不同的问题......

0 投票
2 回答
752 浏览

python - Python 的小数精度与 C 相比如何?

我正在研究寻找第 n 个斐波那契数的黄金比例公式,这让我很好奇。

我知道 Python 可以处理任意大的整数,但是小数的精度如何?它是直接在 C double 或其他东西之上,还是它也使用了更准确的修改实现?(显然不是任意准确的。;D)

0 投票
2 回答
2415 浏览

c++ - C++ 精度:字符串加倍

在对转换为双精度的字符串执行一些操作后,我遇到了双精度问题。

对于作为字符串输入的所有数字,情况并非如此,因此错误不是恒定的。它只影响一些数字(34.38 似乎是恒定的)。

此刻,当我传入 a = 34.38 和 i=100 时,它会返回此值:

如果我将 Val 更改为浮点数,这将起作用,因为精度较低,但我需要双精度。

当我使用 atof、sscanf 和 strtod 而不是 sstream 时,这也是重现。

在 C++ 中,将字符串正确转换为双精度并实际返回准确值的最佳方法是什么?

谢谢。

0 投票
4 回答
5062 浏览

c++ - 从双精度转换为浮点时检测精度损失

我正在编写一段代码,我必须在其中将双精度值转换为浮点值。我正在使用 boost::numeric_cast 进行此转换,这将提醒我任何溢出/下溢。但是我也有兴趣知道这种转换是否会导致一些精度损失。

例如

生成 dest,其值为 1988.1

有什么方法可以检测到这种精度损失/舍入

0 投票
5 回答
7507 浏览

sqlite - 带有浮点数的 SQLite 查询 where 子句失败?

我将浮点数放入基于 Android 的 SQLite 数据库中,如下所示:

当我查询表格时:

光标返回为空。如果我将 float 的值更改为 37.0,它可以正常工作,返回游标中的记录。

我已经对此进行了一定长度的测试,将数据库列规范从“REAL”更改为“float”等。只要我在小数点后有任何小数部分,光标就会返回空。到底是怎么回事?

提前致谢!

0 投票
2 回答
932 浏览

c# - 我在 C# 中的方差函数不返回准确的值

源数据:

方差函数:

Excel 和一些在线计算器说方差是 1.56562E-06 而我的函数给了我 1.53492394804015E-06。我开始怀疑 C# 是否有准确性问题或什么。以前有人遇到过这种问题吗?

0 投票
2 回答
2364 浏览

perl - 与其他语言相比,Fortran 在数值准确性方面是否存在固有限制?

在进行一个简单的编程练习时,我制作了一个 while 循环(Fortran 中的 DO 循环),它旨在在实变量达到精确值时退出。

我注意到由于使用了精度,从未满足相等性并且循环变得无限。当然,这并非闻所未闻,建议不要比较两个数字是否相等,最好看看两个数字之间的绝对差是否小于设定的阈值。

我发现令人失望的是我必须将这个阈值设置得有多低,即使变量是双精度的,我的循环才能正确退出。此外,当我在 Perl 中重写此循环的“蒸馏”版本时,我的数值准确性没有问题,并且循环正常退出。

由于产生问题的代码是如此之小,在 Perl 和 Fortran 中,我想在这里重现它,以防我忽略了一个重要的细节:

Fortran 代码

Perl 代码

Fortran 中注释掉的行是我需要用于循环正常退出的行。请注意,阈值设置为 1E-4,我觉得这很可悲。

变量的名称来自我正在执行的基于自学的编程练习,并且没有任何相关性。

目的是当速度变量达到 1700 时循环停止。

以下是截断的输出:

Perl 输出

...

Fortran 输出

...

如果 Fortran 的准确性很差,那么 Fortran 的速度和易于并行化有什么好处?提醒我做事的三种方式:

  1. 正确的方式

  2. 错误的方法

  3. 最大功率方式

“那不是走错路了吗?”

“是啊!但更快!”

除了开玩笑,我一定做错了什么。

与其他语言相比,Fortran 在数值准确性方面是否存在固有限制,还是我(很可能)是错误的?

我的编译器是 gfortran(gcc 版本 4.1.2),Perl v5.12.1,在双核 AMD Opteron @ 1 GHZ 上。

0 投票
2 回答
1433 浏览

perl - Perl 模运算符问题

为什么第一个示例打印错误的结果?

0 投票
5 回答
1733 浏览

c++ - 浮点 C++ 编译器选项 | 防止 a/b -> a* (1/b)

/fp:fast我正在用 C++ 编写实时数字软件,目前正在使用 Visual-C++ 2008 进行编译。现在使用“快速”浮点模型(

对于我的很多计算来说,数值太不稳定了。

(请参阅:Microsoft Visual C++ 浮点优化

切换到/fp:precise使我的应用程序运行速度慢两倍以上。是否可以微调优化器(即禁用此特定优化),或者以某种方式手动绕过它?

- 实际的最小代码示例:-

[我的实际代码主要是矩阵相关的算法]

输出:VC(cl,版本 15,0x86)是:

拥有一个 div 而不是两个 div 在数值上是一个大问题,(xmm0,从 RAM 中预加载了 1.0f),因为根据 xmm1,2 的值(可能在不同的范围内),您可能会损失很多精度(在没有 SSE 的情况下编译,输出类似的 stack-x87-FPU 代码)。

包装函数

确实解决了准确性问题,但首先,它仅在函数级别(全局范围)上可用,其次,它阻止了函数的内联,(即,速度惩罚太高)

“精确”输出也被转换为“加倍”: