- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在构建一个程序,将 double 值转换为科学值格式(尾数、指数)。然后我注意到下面的内容
369.7900000000000 -> 3.6978999999999997428
68600000 -> 6.8599999999999994316
我注意到其他几个值也有相同的模式。最大分数误差为
0.000 000 000 000 001 = 1*e-15
我知道在计算机中表示 double 值的不准确性。这是否可以得出结论,我们将得到的最大小数误差是 1*e-15
?这有什么重要意义?
大部分关于栈溢出中浮点精度问题的题我都看完了,但是我没有看到任何关于 64 位最大小数误差的问题。
为了清楚我所做的计算,我也提到了我的代码片段
double norm = 68600000;
if (norm)
{
while (norm >= 10.0)
{
norm /= 10.0;
exp++;
}
while (norm < 1.0)
{
norm *= 10.0;
exp--;
}
}
现在我明白了
norm = 6.8599999999999994316;
exp = 7
最佳答案
您获得的号码与 machine epsilon 有关对于 double
数据类型。
double
有 64 位长,其中 1 位用于符号,11 位用于指数,52 位用于尾数。 double
的值由
1.mmmmm... * (2^exp)
尾数只有 52 位,任何 2^-52
以下的 double
值在添加到 1.0
时将完全丢失,因为它的意义不大。在二进制中,1.0 + 2^-52
将是
1.000...00 + 0.000...01 = 1.000.....01
显然,任何更低的值都不会改变 1.0
的值。您可以在程序中自行验证 1.0 + 2^-53 == 1.0
。
这个数字 2^-52 = 2.22e-16
称为机器 epsilon 并且是在一次浮点运算期间发生的相对误差的上限用 double
值舍入误差。
类似地,float
在其尾数中有 23 位,因此其机器 epsilon 为 2^-23 = 1.19e-7
。
你得到 1e-15
的原因可能是因为你执行许多算术运算时错误会累积,但我不能说因为我不知道你正在做的确切计算。
编辑:我已经调查了您的 68600000 问题的相对错误。
首先,您可能有兴趣知道 round-off如果您将计算分成几步,错误可能会改变您的计算结果:
686.0/10.0 = 68.59999999999999431566
686.0/10.0/10.0 = 6.85999999999999943157
686.0/100.0 = 6.86000000000000031974
在第一行中,最接近 68.6 的 double
低于实际值,但在第三行中我们看到最接近 6.86 的 double
更大。
如果我们查看您程序的绝对错误 e_abs = abs(v-v_approx)
,我们会发现它是
6.8600000 - 6.85999999999999943156581139192 ~= 5.684e-16
但是,相对误差 e_abs = abs( (v-v_approx)/v) = abs(e_abs/v)
将是
5.684e-16 / 6.86 ~= 8.286e-17
这确实低于我们的机器 epsilon 2.22e-16
。
This如果您想了解有关浮点运算的所有细节,可以阅读这篇著名的论文。
关于c++ - 转换为科学计数法时出现 double 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28846793/
我正在尝试将一个字符串逐个字符地复制到另一个字符串中。目的不是复制整个字符串,而是复制其中的一部分(我稍后会为此做一些条件......) 但我不知道如何使用迭代器。 你能帮帮我吗? std::stri
我想将 void 指针转换为结构引用。 结构的最小示例: #include "Interface.h" class Foo { public: Foo() : mAddress((uint
这有点烦人:我有一个 div,它从窗口的左上角开始过渡,即使它位于文档的其他任何位置。我试过 usign -webkit-transform-origin 但没有成功,也许我用错了。有人可以帮助我吗?
假设,如果将 CSS3 转换/转换/动画分配给 DOM 元素,我是否可以检测到该过程的状态? 我想这样做的原因是因为我正在寻找类似过渡链的东西,例如,在前一个过渡之后运行一个过渡。 最佳答案 我在 h
最近我遇到了“不稳定”屏幕,这很可能是由 CSS 转换引起的。事实上,它只发生在 Chrome 浏览器 上(可能还有 Safari,因为一些人也报告了它)。知道如何让它看起来光滑吗?此外,您可能会注意
我正在开发一个简单的 slider ,它使用 CSS 过渡来为幻灯片设置动画。我用一些基本样式和一些 javascript 创建了一支笔 here .注意:由于 Codepen 使用 Prefixfr
我正在使用以下代码返回 IList: public IList FindCodesByCountry(string country) { var query =
如何设计像这样的操作: 计算 转化 翻译 例如:从“EUR”转换为“CNY”金额“100”。 这是 /convert?from=EUR&to=CNY&amount=100 RESTful 吗? 最佳答
我使用 jquery 组合了一个图像滚动器,如下所示 function rotateImages(whichHolder, start) { var images = $('#' +which
如何使用 CSS (-moz-transform) 更改一个如下所示的 div: 最佳答案 你可以看看Mozilla Developer Center .甚至还有例子。 但是,在我看来,您的具体示例不
我需要帮助我正在尝试在选中和未选中的汉堡菜单上实现动画。我能够为菜单设置动画,但我不知道如何在转换为 0 时为左菜单动画设置动画 &__menu { transform: translateX(
我正在为字典格式之间的转换而苦苦挣扎:我正在尝试将下面的项目数组转换为下面的结果数组。本质上是通过在项目第一个元素中查找重复项,然后仅在第一个参数不同时才将文件添加到结果集中。 var items:[
如果我有两个定义相同的结构,那么在它们之间进行转换的最佳方式是什么? struct A { int i; float f; }; struct B { int i; float f; }; void
我编写了一个 javascript 代码,可以将视口(viewport)从一个链接滑动到另一个链接。基本上一切正常,你怎么能在那里看到http://jsfiddle.net/DruwJ/8/ 我现在的
我需要将文件上传到 meteor ,对其进行一些图像处理(必要时进行图像转换,从图像生成缩略图),然后将其存储在外部图像存储服务器(s3)中。这应该尽可能快。 您对 nodejs 图像处理库有什么建议
刚开始接触KDB+,有一些问题很难从Q for Mortals中得到。 说,这里 http://code.kx.com/wiki/JB:QforMortals2/casting_and_enumera
我在这里的一个项目中使用 JSF 1.2 和 IceFaces 1.8。 我有一个页面,它基本上是一大堆浮点数字段的大编辑网格。这是通过 inputText 实现的页面上的字段指向具有原始值的值对象
ScnMatrix4 是一个 4x4 矩阵。我的问题是什么矩阵行对应于位置(ScnVector3),旋转(ScnVector4),比例(ScnVector3)。第 4 行是空的吗? 编辑: 我玩弄了
恐怕我是 Scala 新手: 我正在尝试根据一些简单的逻辑将 Map 转换为新 Map: val postVals = Map("test" -> "testing1", "test2" -> "te
输入: This is sample 1 This is sample 2 输出: ~COLOR~[Green]This is sample 1~COLOR~[Red]This is sam
我是一名优秀的程序员,十分优秀!