我希望从0.0001到1计数,在ruby中有0.0001步.我写了这段代码,但它进入了无限循环.为什么口译员做错了总结.
x = 0.0001
while x != 1.0
puts x
x = x + 0.0001
end
Run Code Online (Sandbox Code Playgroud)
这是它给出的前10个值:
0.0001
0.0002
0.00030000000000000003
0.0004
0.0005
0.0006000000000000001
0.0007000000000000001
0.0008000000000000001
0.0009000000000000002
0.0010000000000000002
Run Code Online (Sandbox Code Playgroud)
它应该是0.0001,0.0002,0.0003等......我怎样才能使它工作?谢谢!
我正在研究我的Mandelbrot屏幕保护程序的新版本,并且我的浮点精确度已经不足了- 简单的双值没有足够的重要数据来满足我的需求.
更重要的数字=更大程度的放大分形
回到我在Delphi 7中编写这个屏幕保护程序的版本时,我使用了80位大小的扩展浮点类型.
在.NET中,我可以切换到十进制,但是这对性能的影响非常糟糕,分形生成速度减慢了20倍左右.
有没有相当于扩展的.NET?或者,是否有任何数字类型的精度高于double仍然使用FPU进行评估,因此不具有十进制的高性能命中?
更新
我的屏幕保护程序已经设法通过许多(很多!)数量级缩放分形; 目前,只有当使用的数字类型无法分隔相邻像素的纵坐标时,它才会重置为基础分形.来自双倍扩展改进的额外16位精度将使我接近16倍的大小倍增.
至于性能,我的算法已经设法消除了所需数学的95-99%(与计算许多像素的简单实现相比),同时保留了分形的完整性.
是否有可能建立甚至粗略地说明在处理doublejava中的两个值(加/减)时最大精度损失是多少?可能最坏的情况是两个数字无法准确表示,然后对它们执行操作,这导致一个也无法准确表示的值.
我的问题是我必须使用一个thrid-party函数/算法,它将一个double -precision值数组作为输入,但显然可能对输入数据中的非常小的变化敏感.但是对于我的应用程序,我必须获得相同的结果(几乎)相同的输入!特别是我有两个测试输入数组,它们在小数点后的第5个位置是相同的,但我仍然得到不同的结果.那么导致"问题"的原因必须是在小数点后的第5个位置之后.
现在我的想法是将输入四舍五入到稍低的精度,以便从非常相似的输入获得相同的结果,但不是 100%相同.因此,我正在寻找一种好的/有效的方法来将双精度值舍入到稍低的精度.到目前为止,我使用此代码舍入到小数点后的第9个位置:
double x = original_input();
x = double(qRound(x * 1000000000.0)) / 1000000000.0;
Run Code Online (Sandbox Code Playgroud)
这里qRound()是Qt的正常的double到整数舍入函数.这段代码有效,它确实通过两个"有问题"的测试集解决了我的问题.但是:有更有效的方法吗?
还有什么困扰我:对于-100.0到100.0范围内的输入数据,舍入到小数点后的第9个位置可能是合理的(就像我当前的输入数据一样).但是,例如,对于-0.001到0.001范围内的输入数据,可能太多(即,太多精度损失).不幸的是,我不知道在其他情况下我的输入值会在什么范围内......
毕竟,我认为我需要的是一个函数,它执行以下操作:通过适当的舍入,将给定的双精度值X切换到小数点后的最多LN位置,其中L是位置数在double -precision可以存储(表示)给定值的小数点之后; 和N是固定的,就像3.这意味着对于"小"值,我们将允许小数点后的位置比"大"值更多.换句话说,我想将64位浮点值舍入到(稍微)更小的精度,如60位或56位,然后将其存储回64位双精度值.
你能理解这个吗?如果是这样,你能否建议一种在C++中有效地做到这一点的方法???
提前致谢!
我需要生成一个二进制文件,其中只包含唯一的随机数,具有单精度.然后,目的是计算该文件的熵并将其与其他数据集熵一起使用以计算比率entropy_file/entropy_randUnique.该值被命名为"随机性".
我可以在python中使用双精度数字并插入它们set(),使用struct.pack如下:
numbers = set()
while len(numbers) < size:
numbers.add(struct.pack(precision,random.random()))
for num in numbers:
file.write(num)
Run Code Online (Sandbox Code Playgroud)
但是当我改为单精度时,我不能只改变包方法(这会产生很多相同的数字而while会永远不会结束),而且我无法生成单精度数random.我已经研究过,numpy但发电机的工作原理与我理解的相同.如何在二进制文件中获得370914252(这是我最大的测试用例)唯一的float32,即使它们不是随机的,我认为一个洗牌序列就足够了......
python floating-point numpy floating-point-precision floating-point-conversion
设,x是一个整数和y = x * x.
那保证sqrt(y) == x吗?
例如,我可以确定sqrt(25)或sqrt(25.0)将返回5.0,不是5.0000000003或4.999999998?
关于Go中浮点精度的问题使我想知道C如何处理问题.
使用C中的以下代码:
float a = 0.1;
Run Code Online (Sandbox Code Playgroud)
将a具有最接近的IEEE 754二进制表示:
00111101110011001100110011001101 (Decimal: 0.10000000149011612)
Run Code Online (Sandbox Code Playgroud)
或者只是将它裁剪成:
00111101110011001100110011001100 (Decimal: 0.09999999403953552)
Run Code Online (Sandbox Code Playgroud)
或者根据编译器/平台的不同而不同?
我猜有一些我无法找到的标准技巧:无论如何,我想以数字稳定的方式计算一个非常接近1的数字的大功率(认为1-p,其中p <1e-17) .在我的系统上,1-p被截断为1.
使用对数的泰勒展开式,我得到以下边界
我能做些什么更聪明的事吗?
floating-point r numerical-stability floating-point-precision
是否存在提供工程符号格式(如String)的现有Haskell函数?
如果没有,我读到printf可以通过添加实例来扩展PrintfArg.你相信这是一个很好的解决方案吗?
通过工程符号,我的意思是指数符号,其指数是3的倍数.
floating-point formatting haskell scientific-notation floating-point-precision
我试图通过使用_.round然后将数字乘以100 来显示数字百分比.出于某种原因,当我乘以舍入数字时,精度会变得混乱.这是它的样子:
var num = 0.056789,
roundingPrecision = 4,
roundedNum = _.round(num, roundingPrecision),
percent = (roundedNum * 100) + '%';
console.log(roundedNum); // 0.0568
console.log(percent); // 5.680000000000001%
Run Code Online (Sandbox Code Playgroud)
为什么在乘以100后将0.000000000000001添加到数字?
javascript rounding percentage floating-point-precision lodash
c++ ×2
double ×2
rounding ×2
c ×1
c# ×1
formatting ×1
haskell ×1
java ×1
javascript ×1
lodash ×1
numpy ×1
percentage ×1
performance ×1
python ×1
r ×1
ruby ×1