因为PHP中的float数据类型不准确,并且MySQL中的FLOAT占用的空间比INT多(并且不准确),所以我总是将价格存储为INT,在存储之前乘以100,以确保我们精确到2位小数的精度.但是我认为PHP是行为不端的.示例代码:
echo "<pre>";
$price = "1.15";
echo "Price = ";
var_dump($price);
$price_corrected = $price*100;
echo "Corrected price = ";
var_dump($price_corrected);
$price_int = intval(floor($price_corrected));
echo "Integer price = ";
var_dump($price_int);
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)
产量:
Price = string(4) "1.15"
Corrected price = float(115)
Integer price = int(114)
Run Code Online (Sandbox Code Playgroud)
我很惊讶.当最终结果低于预期值1时,我期待我的测试结果看起来更像:
Price = string(4) "1.15"
Corrected price = float(114.999999999)
Integer price = int(114)
Run Code Online (Sandbox Code Playgroud)
这将证明浮动类型的不准确性.但为什么楼(115)返回114?
我想确定(在c ++中)一个浮点数是否是另一个浮点数的乘法逆.问题是我必须使用第三个变量来完成它.例如这段代码:
float x=5,y=0.2;
if(x==(1/y)) cout<<"They are the multiplicative inverse of eachother"<<endl;
else cout<<"They are NOT the multiplicative inverse of eachother"<<endl;
Run Code Online (Sandbox Code Playgroud)
将输出:"他们不是......"这是错的,这段代码:
float x=5,y=0.2,z;
z=1/y;
if(x==z) cout<<"They are the multiplicative inverse of eachother"<<endl;
else cout<<"They are NOT the multiplicative inverse of eachother"<<endl;
Run Code Online (Sandbox Code Playgroud)
将输出:"他们......"这是正确的.
为什么会这样?
我的Java程序以高精度计算为中心,需要精确到至少120个小数位.
因此,所有非整数都将由程序中的BigDecimals表示.
显然,我需要为BigDecimals指定舍入的准确性,以避免无限的十进制表达式等.
目前,我发现必须在BigDecimal的每个实例化或数学运算中指定精度是一个巨大的麻烦.
有没有办法为所有BigDecimal计算设置"全局准确度"?
(比如python中Context.prec()的Decimal模块)
谢谢
规格:
Java jre7 SE
Windows 7(32)
OCaml中是否存在整数取幂的函数?**仅适用于花车.虽然看起来大部分都是准确的,但是不存在精确错误的可能性,例如2.**3. = 8.有时会返回错误?是否有用于整数求幂的库函数?我可以写自己的,但效率问题就出现了,如果没有这样的功能我也会感到惊讶.
比较两个浮点数a_float == b_float由于寻找麻烦,因为a_float / 3.0 * 3.0可能不等于a_float由于舍入错误.
人们通常做的事情是这样的fabs(a_float - b_float) < tol.
如何计算tol?
理想情况下,公差应该大于一个或两个最低有效数字的值.因此,如果使用单精度浮点数tol = 10E-6应该是正确的.然而,这对于a_float可能非常小或可能非常大的一般情况不适用.
如何tol正确计算所有一般情况?我特别感兴趣的是C或C++案例.
我有一个大代码,它根据概率密度函数(PDF)中的概率在一个点上对数组中的值进行采样.
要做到这一点,我使用numpy.random.choice直到很好numpy 1.8.0.这是一个MWE(文件pdf_probs.txt可以在这里下载):
import simplejson
import numpy as np
# Read probabilities from file.
f = open('pdf_probs.txt', 'r')
probs = simplejson.load(f)
f.close()
print sum(probs) # <-- Not *exactly* 1. but very close: 1.00000173042
# Define array.
arr = np.linspace(1., 100., len(probs))
# Get samples using the probabilities in probs.
samples = np.random.choice(arr, size=1000, replace=True, p=probs)
Run Code Online (Sandbox Code Playgroud)
问题是用numpy 1.9.0上面的代码测试后失败并出现错误:
Traceback (most recent call last):
File "numpy_180_vs_190_np_random_choice.py", line 13, in <module> …Run Code Online (Sandbox Code Playgroud) 当我注意到Libre Office电子表格显示远远低于2 ^ 53的数字的错误值时,我正在做一些计算以计划我的主筛的改进实现,这是FoxPro中的精确整数计算的限制以及众多其他内部使用C double(即IEEE 754双)的语言.
一些快速检查显示数字低至2 ^ 50的错误结果.更糟糕的是,这个片状软件没有发出任何超出其操作限制的警告,并且显示的值只是近似值(即使手动输入了正确的值).我猜他们认为什么对于像Excel这样的POS来说足够好然后必须对他们足够好(但是他们应该把它命名为'Guesstimate'而不是'Calc'然后).
无论如何,是否有可能将电子表格放入某种精确模式,至少给出a的精度double,和/或当某些计算超出其数值能力时,它会显示某种警告?
或者是否有一些其他电子表格适用于甚至电话和烤面包机由64位芯片供电的时代的程序员?
背景:在这种特殊情况下,需要精确度,因为通过比较某些结果列和众所周知的数字列表(如最多2 ^ k的素数,可从OEIS获得)或数字来验证公式的精确性源自检测代码.我们的想法是通过检查它们的可行范围来获得正确的公式 - 最多在2 ^ 32和2 ^ 40之间 - 然后使用这些公式来研究范围最大为2 ^ 64的行为(这是不可能的通过详尽的测试获得完整的图片.
PS:我发现在"电子表格的数字准确性"(pdf)中已经对该问题进行了广泛的分析.似乎gnumeric比其他人更好一点,但更多的是盲人中的独眼人而不是真正的通过集合; 此外,它不适用于Windows,因此需要在我正在开发的平台上启动Linux VM以及...
UPDATE /替代方法
最多2 ^ 49没有问题,因此可以正常工作.这足以准确了解事物.在最终表格中,大数字和高精度结果(在其他地方计算)作为预格式化文本输入(或者更确切地说是导入/粘贴),以便Calc不会使显示屏变脏.仍然可以通过应用VALUE()函数来引用数字,对于许多内联计算,内部精度非常充足 - 尤其对于图形化.
下图显示了我在其中一条评论中发布的内容,即内部精度高于显示的内容.如果程序没有显示它们,我们如何才能找出实际值是什么?通过添加/减去小值,观察更改,创建和测试关于实际值的关系,假设的舍入行为和显示值的假设来解决问题?真正令人难以置信的是.

我正在为以下任何一项提供奖励:
一种实用的方法,在所见即所得的意义上恢复Calc的理智行为(你看到的是什么内部,或者更确切地说,如果它在里面然后它可以显示)而不降低内部精度并且不用分支整个血腥源树并自己修复它
指向电子表格的指针,其精度高于IEEE 754双倍(最好是任意精度,如GP/PARI,但作为电子表格),是公共域或共享软件; 在线/云计算的东西是可以接受的
第一项的原因有两个:一方面,当电子表格精度低于通用IEEE 754双精度时,这是一种血腥的麻烦,因为这意味着关于该基线水平的准确度/精度/稳定性的经验/知识不会延续.另一方面,如果我们不能相信显示的值是正确的,即使我们确切知道实际值是正确的,也会产生更大的麻烦.
第二个项目的原因很简单,在另一个程序中编写用于高精度计算事物或使用bignums的东西,或者为此目的编辑/编译/运行程序是相当麻烦的.除了笨拙地分成电子表格和一堆脚本或源文件之外,在电子表格内部工作更加自然和方便.
precision spreadsheet floating-accuracy arbitrary-precision libreoffice-calc
运行此代码时出现无限循环:
intensity = 0.50
while intensity != 0.65:
print(intensity)
intensity = intensity + 0.05
Run Code Online (Sandbox Code Playgroud)
强度值应该像 0.50 -> 0.55 -> 0.60 -> 0.65 然后它应该退出循环。为什么程序会执行无限循环?
我正在尝试诊断并修复一个可归结为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