我有花车的数组,其中数据存储与不同的小数点所以有的123.40000,123.45000,123.45600...现在如果我要在打印字符串中的这些值,而不到底0 printf(),让自己123.4,123.45,123.456,没有那些0到底.这可能吗?如果是这样,怎么样?
据我了解,Ruby(1.9.2)浮点数的精度为15位十进制数.因此,我希望舍入浮点x到15位小数将等于x.对于这种计算,情况并非如此.
x = (0.33 * 10)
x == x.round(15) # => false
Run Code Online (Sandbox Code Playgroud)
顺便说一句,舍入到16位返回true.
你能解释一下吗?
我目前正在收紧浮点数值以估算一个值.(p(k,t)对于那些感兴趣的人来说.)从本质上讲,效用永远不会低估这个值:可能的素数生成的安全性取决于数字上强大的实现.虽然输出结果与公布的值一致,但我使用该DBL_EPSILON值来确保除法产生的结果永远不会小于真值:
考虑: double x, y; /* assigned some values... */
评估:r = x / y;频繁发生,但这些(有限精度)结果可能会截断真实结果中的有效数字 - 可能是无限精确的合理扩展.我目前试图通过对分子应用偏差来缓解这种情况,即
r = ((1.0 + DBL_EPSILON) * x) / y;
Run Code Online (Sandbox Code Playgroud)
如果你对这个问题一无所知,p(k,t)通常比大多数估计要小得多 - 但是用这个"观察"来解决问题根本不够好.我当然可以说:
(((1.0 + DBL_EPSILON) * x) / y) >= (x / y)
Run Code Online (Sandbox Code Playgroud)
当然,我需要确保'偏差'结果大于或等于'确切'值.虽然我确信它与操纵或缩放有关DBL_EPSILON,但我显然希望"偏差"结果超出"精确"结果的最小值 - 可以在IEEE-754算术假设下证明.
是的,我看过Goldberg的论文,并且我一直在寻找一个强大的解决方案.请不要建议操纵舍入模式.理想情况下,我是一个非常了解浮点定理的人的回答,或者知道一个非常好的例子.
编辑:澄清(((1.0 + DBL_EPSILON) * x) / y)或表格(((1.0 + c) * x) / y)不是先决条件.这只是我使用的方法"可能足够好",没有为它提供坚实的基础.我可以说分子和分母不是特殊值:NaNs,Infs等,分母也不是零.
这是一个有趣的问题,我试图在前几天工作.是否有可能强制一个的有效数或指数与Python中的float另一个相同float?
问题出现了,因为我试图重新缩放某些数据,以便min和max匹配另一个数据集.但是,我重新调整后的数据略有偏差(大约小数点后6位),这足以引起问题.
提出一个想法,我有f1和f2(type(f1) == type(f2) == numpy.ndarray).我想要np.max(f1) == np.max(f2) and np.min(f1) == np.min(f2).为此,我做到了:
import numpy as np
f2 = (f2-np.min(f2))/(np.max(f2)-np.min(f2)) # f2 is now between 0.0 and 1.0
f2 = f2*(np.max(f1)-np.min(f1)) + np.min(f1) # f2 is now between min(f1) and max(f1)
Run Code Online (Sandbox Code Playgroud)
结果(仅作为示例)将是:
np.max(f1) # 5.0230593
np.max(f2) # 5.0230602 but I need 5.0230593
Run Code Online (Sandbox Code Playgroud)
我最初的想法是,强制指数float将是正确的解决方案.我找不到多少,所以我为我的需要做了一个解决方法:
exp = 0
mm = np.max(f1)
# find where the decimal …Run Code Online (Sandbox Code Playgroud) 我事先审查了以下帖子.有没有办法使用具有近似因子或容差值的DataFrame.isin()?还是有其他方法可以吗?
EX)
df = DataFrame({'A' : [5,6,3.3,4], 'B' : [1,2,3.2, 5]})
In : df
Out:
A B
0 5 1
1 6 2
2 3.3 3.2
3 4 5
df[df['A'].isin([3, 6], tol=.5)]
In : df
Out:
A B
1 6 2
2 3.3 3.2
Run Code Online (Sandbox Code Playgroud) python comparison floating-accuracy comparison-operators pandas
任何人都可以解释为什么当我使用setprecision()时,这两个相同值的变量可以输出不同的值?
#include <iostream>
#include <iomanip>
int main()
{
float a=98.765;
double b = 98.765;
//std::cout<<std::setprecision(2)<<a<<std::endl;
std::cout<<std::fixed;
std::cout<<std::setprecision(2)<<a<<std::endl;
std::cout<<std::setprecision(2)<<b<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
a的输出为98.76,而b的输出为98.77.
可能重复:
浮点不准确示例
double a = 0.3;
std::cout.precision(20);
std::cout << a << std::endl;
Run Code Online (Sandbox Code Playgroud)
结果:0.2999999999999999889
double a, b;
a = 0.3;
b = 0;
for (char i = 1; i <= 50; i++) {
b = b + a;
};
std::cout.precision(20);
std::cout << b << std::endl;
Run Code Online (Sandbox Code Playgroud)
结果:15.000000000000014211
所以..'a'比它应该小.但是,如果我们采取'a'50次 - 结果会比它应该更大.
为什么是这样?如何在这种情况下得到正确的结果?
由于减法中的浮点误差,在以下情况下是否可以除零?
float x, y, z;
...
if (y != 1.0)
z = x / (y - 1.0);
Run Code Online (Sandbox Code Playgroud)
换句话说,以下是否更安全?
float divisor = y - 1.0;
if (divisor != 0.0)
z = x / divisor;
Run Code Online (Sandbox Code Playgroud) c++ floating-point floating-accuracy divide-by-zero floating-point-precision
我们知道浮点数被打破了,因为十进制数不能总是用二进制来完美表示.它们四舍五入到可以用二进制表示的数字; 有时这个数字更高,有时它更低.在这种情况下,使用无处不在的IEEE 754双格式,高0.1和0.4:
0.1 = 0.1000000000000000055511151231257827021181583404541015625
0.4 = 0.40000000000000002220446049250313080847263336181640625
Run Code Online (Sandbox Code Playgroud)
由于这两个数字都很高,你可以期望它们的总和也很高.完美的添加应该会给你0.5000000000000000277555756156289135105907917022705078125,但你会得到一个很好的确切0.5.为什么?
我正在尝试编写一个函数来处理我正在编程的游戏中的运动。我几乎拥有的作品,但是在某些情况下它崩溃了。
我已经编写了一个最小的说明性示例,如下所示。在此示例中,我试图计算由点表示的对象的移动和运动矢量。根据一组多边形检查该对象的移动路径,这些多边形被细分为线段以进行测试。当此对象与线段碰撞时,我希望它沿该线段滑动(而不是停下来或反弹)。
为此,我沿着预期的碰撞路径进行检查,如果找到了相交点,则沿着相交的线段的路径从该相交点进行新的测试,并计算其余运动的幅度。
当我们沿着线段滑入“口袋”时,就会出现问题。通常,碰撞检查会通过形成凹穴的两个线段,并且物体会滑过。因为我平行于一个线段行进,并且在端点处与两个线段相交,所以我认为此问题是由浮点错误引起的。它是否通过,被捕获或被捕获一次,然后在第二次检查中通过都似乎完全是随机的。
我正在使用在这里找到的简单算法来计算交集:https : //stackoverflow.com/a/20679579/4208739,但是我也尝试了许多其他算法。都表现出相同的问题。
(Vector2是Unity库提供的类,它仅将x和y坐标保存为浮点数。Vector2.Dot函数仅计算点积)。
//returns the final destination of the intended movement, given the starting position, intended direction of movement, and provided collection of line segments
//slideMax provides a hard cap on number of slides allowed before we give up
Vector2 Move(Vector2 pos, Vector2[] lineStarts, Vector2[] lineEnds, Vector2 moveDir, int slideMax)
{
int slideCount = 0;
while (moveDir != Vector2.zero && slideCount < slideMax)
{
pos = DynamicMove(pos, lineStarts, lineEnds, moveDir, out moveDir);
slideCount++; …Run Code Online (Sandbox Code Playgroud)