问题标签 [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.
math - 如何解决一些舍入错误?
我有一个在.NET 中处理一些地理坐标的方法,并且我有一个存储坐标对的结构,如果为其中一个坐标传入 256,则它变为 0。但是,在一个特定实例中,值为大约 255.99999998 被计算出来,因此存储在结构中。当它在 ToString() 中打印时,它变成 256,这不应该发生 - 256 应该是 0。我不介意它是否打印 255.9999998,但是当调试器显示 255.99999998 时它打印 256 是一个问题。让它同时存储和显示 0 会更好。
具体来说,比较存在问题。255.99999998 足够接近 256 以至于它应该等于它。比较双打时应该怎么做?使用某种 epsilon 值?
编辑:具体来说,我的问题是我取一个值,执行一些计算,然后对该数字执行相反的计算,我需要准确地取回原始值。
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 的错误,在我看来这是相当大的,这表明手头有一个不同的问题......
python - Python 的小数精度与 C 相比如何?
我正在研究寻找第 n 个斐波那契数的黄金比例公式,这让我很好奇。
我知道 Python 可以处理任意大的整数,但是小数的精度如何?它是直接在 C double 或其他东西之上,还是它也使用了更准确的修改实现?(显然不是任意准确的。;D)
c++ - C++ 精度:字符串加倍
在对转换为双精度的字符串执行一些操作后,我遇到了双精度问题。
对于作为字符串输入的所有数字,情况并非如此,因此错误不是恒定的。它只影响一些数字(34.38 似乎是恒定的)。
此刻,当我传入 a = 34.38 和 i=100 时,它会返回此值:
如果我将 Val 更改为浮点数,这将起作用,因为精度较低,但我需要双精度。
当我使用 atof、sscanf 和 strtod 而不是 sstream 时,这也是重现。
在 C++ 中,将字符串正确转换为双精度并实际返回准确值的最佳方法是什么?
谢谢。
c++ - 从双精度转换为浮点时检测精度损失
我正在编写一段代码,我必须在其中将双精度值转换为浮点值。我正在使用 boost::numeric_cast 进行此转换,这将提醒我任何溢出/下溢。但是我也有兴趣知道这种转换是否会导致一些精度损失。
例如
生成 dest,其值为 1988.1
有什么方法可以检测到这种精度损失/舍入
sqlite - 带有浮点数的 SQLite 查询 where 子句失败?
我将浮点数放入基于 Android 的 SQLite 数据库中,如下所示:
当我查询表格时:
光标返回为空。如果我将 float 的值更改为 37.0,它可以正常工作,返回游标中的记录。
我已经对此进行了一定长度的测试,将数据库列规范从“REAL”更改为“float”等。只要我在小数点后有任何小数部分,光标就会返回空。到底是怎么回事?
提前致谢!
c# - 我在 C# 中的方差函数不返回准确的值
源数据:
方差函数:
Excel 和一些在线计算器说方差是 1.56562E-06 而我的函数给了我 1.53492394804015E-06。我开始怀疑 C# 是否有准确性问题或什么。以前有人遇到过这种问题吗?
perl - 与其他语言相比,Fortran 在数值准确性方面是否存在固有限制?
在进行一个简单的编程练习时,我制作了一个 while 循环(Fortran 中的 DO 循环),它旨在在实变量达到精确值时退出。
我注意到由于使用了精度,从未满足相等性并且循环变得无限。当然,这并非闻所未闻,建议不要比较两个数字是否相等,最好看看两个数字之间的绝对差是否小于设定的阈值。
我发现令人失望的是我必须将这个阈值设置得有多低,即使变量是双精度的,我的循环才能正确退出。此外,当我在 Perl 中重写此循环的“蒸馏”版本时,我的数值准确性没有问题,并且循环正常退出。
由于产生问题的代码是如此之小,在 Perl 和 Fortran 中,我想在这里重现它,以防我忽略了一个重要的细节:
Fortran 代码
Perl 代码
Fortran 中注释掉的行是我需要用于循环正常退出的行。请注意,阈值设置为 1E-4,我觉得这很可悲。
变量的名称来自我正在执行的基于自学的编程练习,并且没有任何相关性。
目的是当速度变量达到 1700 时循环停止。
以下是截断的输出:
Perl 输出
...
Fortran 输出
...
如果 Fortran 的准确性很差,那么 Fortran 的速度和易于并行化有什么好处?提醒我做事的三种方式:
正确的方式
错误的方法
最大功率方式
“那不是走错路了吗?”
“是啊!但更快!”
除了开玩笑,我一定做错了什么。
与其他语言相比,Fortran 在数值准确性方面是否存在固有限制,还是我(很可能)是错误的?
我的编译器是 gfortran(gcc 版本 4.1.2),Perl v5.12.1,在双核 AMD Opteron @ 1 GHZ 上。
perl - Perl 模运算符问题
为什么第一个示例打印错误的结果?
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 代码)。
包装函数
确实解决了准确性问题,但首先,它仅在函数级别(全局范围)上可用,其次,它阻止了函数的内联,(即,速度惩罚太高)
“精确”输出也被转换为“加倍”: