我和我的博士 学生在物理数据分析环境中遇到了一个问题,我可以使用一些洞察力.我们的代码可以分析来自LHC实验之一的数据,从而产生不可重复的结果.特别地,在相同机器上运行的相同二进制获得的计算结果可以在连续执行之间不同.我们知道许多不同的不可再生性来源,但已排除了通常的嫌疑人.
在比较名义上具有相同值的两个数字时,我们已经将问题跟踪到(双精度)浮点比较运算的不可再现性.由于分析中的先前步骤,偶尔会发生这种情况.我们刚刚找到一个示例来测试一个数字是否小于0.3(请注意,我们永远不会测试浮点值之间的相等性).事实证明,由于探测器的几何形状,计算有可能偶尔产生精确到0.3(或其最接近的双精度表示)的结果.
我们非常清楚比较浮点数以及FPU中过度精度可能影响比较结果的缺陷.我想回答的问题是"为什么结果不可复制?" 是因为FPU寄存器加载或其他FPU指令没有清除多余的位,因此先前计算中的"剩余"位会影响结果吗?(这似乎不太可能)我在另一个论坛上看到一个建议,即进程或线程之间的上下文切换也可能导致浮点比较结果的变化,因为FPU的内容存储在堆栈中,因此被截断.任何关于这些=或其他可能的解释的评论将不胜感激.
我正在尝试诊断并修复一个可归结为X/Y的错误,当X和Y很小时会产生不稳定的结果:

在这种情况下,cx和patharea都会顺利增加.它们的比例在高数字时是平滑的渐近线,但对于"小"数字则不稳定.显而易见的第一个想法是我们达到浮点精度的极限,但实际数字本身远不及它.ActionScript"Number"类型是IEE 754双精度浮点数,因此应该有15个十进制数字的精度(如果我读得正确).
分母(patharea)的一些典型值:
0.0000000002119123
0.0000000002137313
0.0000000002137313
0.0000000002155502
0.0000000002182787
0.0000000002200977
0.0000000002210072
Run Code Online (Sandbox Code Playgroud)
分子(cx):
0.0000000922932995
0.0000000930474444
0.0000000930582124
0.0000000938123574
0.0000000950458711
0.0000000958000159
0.0000000962901528
0.0000000970442977
0.0000000977984426
Run Code Online (Sandbox Code Playgroud)
这些中的每一个都单调增加,但如上所述,这个比例是混乱的.
在更大的数字,它平稳到平滑的双曲线.
所以,我的问题是:当你需要分开时,处理非常小数字的正确方法是什么?
我想提前将分子和/或分母乘以1000,但是不能完全解决.
有问题的实际代码是这里的recalculate()功能.它计算多边形的质心,但是当多边形很小时,质心在该位置周围不规则地跳跃,并且可能与多边形相距很远.上面的数据系列是以一致的方向移动多边形的一个节点的结果(手动,这就是为什么它不是非常平滑).
这是Adobe Flex 4.5.
floating-point double division floating-accuracy actionscript-3
任何人都可以推荐任何包含维护各种浮点运算稳定性的策略的C++库/例程/包吗?
示例:假设您希望long double在单位间隔(0,1)中对一百万个向量/数组求和,并且每个数字的大小大致相同.天真的求和for (int i=0;i<1000000;++i) sum += array[i]; 是不可靠的 - 足够大i,sum将会比一个更大的数量级array[i],因此sum += array[i]相当于sum += 0.00.(注意:此示例的解决方案是二进制求和策略.)
我处理数千/数百万微小概率的总和和产品.我使用MPFRC++具有2048位有效数的任意精度库,但仍然适用相同的问题.
我主要关心的是:
我在文本文件中有以下格式的文件,我试图读入一个pandas数据帧.
895|2015-4-23|19|10000|LA|0.4677978806|0.4773469340|0.4089938425|0.8224291972|0.8652525793|0.6829942860|0.5139162227|
Run Code Online (Sandbox Code Playgroud)
如您所见,输入文件中的浮点后有10个整数.
df = pd.read_csv('mockup.txt',header=None,delimiter='|')
Run Code Online (Sandbox Code Playgroud)
当我尝试将其读入数据帧时,我没有得到最后4个整数
df[5].head()
0 0.467798
1 0.258165
2 0.860384
3 0.803388
4 0.249820
Name: 5, dtype: float64
Run Code Online (Sandbox Code Playgroud)
如何获得输入文件中的完整精度?我有一些需要执行的矩阵操作,所以我不能把它作为字符串.
我发现我必须做些什么,dtype但我不知道应该在哪里使用它.
我正在尝试用D编程语言编写一个函数来替换对C的strtold的调用.(基本原理:要使用来自D的strtold,你必须将D字符串转换为C字符串,这是低效的.另外,strtold不能在编译时执行.)我想出了一个主要有效的实现,但是我似乎在最不重要的位上失去了一些精确度.
算法的有趣部分的代码如下,我可以看到精度损失来自哪里,但我不知道如何摆脱它.(我遗漏了许多与核心算法无关的代码部分,以节省人们的阅读.)什么字符串到浮点算法将保证结果尽可能接近IEEE编号line到字符串表示的值.
real currentPlace = 10.0L ^^ (pointPos - ePos + 1 + expon);
real ans = 0;
for(int index = ePos - 1; index > -1; index--) {
if(str[index] == '.') {
continue;
}
if(str[index] < '0' || str[index] > '9') {
err();
}
auto digit = cast(int) str[index] - cast(int) '0';
ans += digit * currentPlace;
currentPlace *= 10;
}
return ans * sign;
Run Code Online (Sandbox Code Playgroud)
此外,我正在使用旧版本的单元测试,其中包括:
assert(to!(real)("0.456") == 0.456L);
Run Code Online (Sandbox Code Playgroud)
我的函数生成的答案是否有可能比解析浮点文字时编译器生成的表示更准确,但编译器(用C++编写)总是与strtold完全一致,因为它在内部使用strtold进行解析浮点文字?
可能重复:
为什么这些数字不相等?
0.9 == 1-0.1 >>> TRUE
0.9 == 1.1-0.2 >>> FALSE
Run Code Online (Sandbox Code Playgroud) 在Java中,没有精确表示浮点运算.例如这个java代码:
float a = 1.2;
float b= 3.0;
float c = a * b;
if(c == 3.6){
System.out.println("c is 3.6");
}
else {
System.out.println("c is not 3.6");
}
Run Code Online (Sandbox Code Playgroud)
打印"c不是3.6".
我对超过3位小数的精度感兴趣(#.###).我如何处理这个问题来乘以浮点数并可靠地比较它们?
我有点困惑为什么python在这种情况下添加一些额外的十进制数,请帮忙解释一下
>>> mylist = ["list item 1", 2, 3.14]
>>> print mylist ['list item 1', 2, 3.1400000000000001]
Run Code Online (Sandbox Code Playgroud) 我是C#的初学者,我正在使用浮点数.我需要在这两个数字之间进行减法,但它不起作用.我知道这是由浮点数引起的,但我该如何解决呢?如果你这么好,你可以解释一下为什么会发生这种情况吗?提前致谢.