可能重复:
浮点比较
嗯,这是一个奇怪的.通常以下if( 4.0 == 4.0 ){return true}将永远返回true.在一个简单的小型opengl 3d'射手'程序中,当我试图添加"跳跃"效果时,情况并非如此.
这个想法相当简单,我有一个三角形条带的地形,因为"角色"移动/走动你沿着一个2d阵列的高度移动,因此你在山丘/低谷的各个高度上下走动.
在drawScene()函数之外(或者如果你知道opengl,那么glutDisplayFunc()),我有一个update()函数,当他'跳'时,它会上升和下调字符,这就是调用drawScene().用语言来说,我可以解释它的高级别,跳跃算法如下:
参数:
double currentJumpingHeight
double maximumJumpingHeight = 4.0
double ypos;
const double jumpingIncrement = 0.1; //THE PROBLEM!!!! HAS TO BE A MULTIPLE OF 0.5!!
bool isJumping = false;
bool ascending = true;
Run Code Online (Sandbox Code Playgroud)
算法:
(when space is pressed) isJumping = true.
if ascending = true and isJumping = true,
currentJumpHeight += jumpingIncrement (and the same for ypos)
if currentJumpingHeight …Run Code Online (Sandbox Code Playgroud) 我用的时候:
if( a>=0 && a<100 && b>=0 && b<200 )
Run Code Online (Sandbox Code Playgroud)
一切正常,但如果我使用:
if( 0<=a<100 && 0<=b<200 )
Run Code Online (Sandbox Code Playgroud)
我的程序崩溃了.a和b =浮动.有人可以告诉我有什么区别吗?
为什么Scala中乘法0.3和3的结果是0.89999999999999?
我想知道为什么在Java中它通过执行以下操作给出了编译错误:
double d34324.34; //error
float f3342.34; //error
Run Code Online (Sandbox Code Playgroud)
另一方面:
long L32423424; // works fine
double D32432424; // works fine
Run Code Online (Sandbox Code Playgroud)
所以基本上我想知道为什么只有浮点值的语法使用这个限制.
我知道如果字母标识符(D,d,F,f)放在它工作的数字的末尾,但我仍然想知道为什么另一种形式不适用于浮点数.只是好奇,我知道如果我键入3443.43434f它的工作原理.
我使用了javascripts eval函数.但我不喜欢结果.如何解决这个问题?
表达:
的eval(1.2 + 24-25)
结果:
0.1999999999999993
我想要0.2结果.
我刚刚在c ++中遇到过这个问题
std::cout << -5.0000004768371582 + 5 << "\n";
Run Code Online (Sandbox Code Playgroud)
这将打印-4.76837e-007,即使你认为它会打印像0.000000476 ...我知道浮点数并不总是正确的,但我以前从未见过这个.我也看到过这与其他数字有关.
为什么是这样.我怎么能解决它?
我见过这样的帖子:
和许多其他相关的帖子.
我在d3js库中看到,它使用以下比较:
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
Run Code Online (Sandbox Code Playgroud)
可以在C/C++中使用它来进行比较double和float吗?
for (float x = 0.00; x < 1.00; x += 0.01) {
cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)
我预计
0.00
0.01
0.02
...
Run Code Online (Sandbox Code Playgroud)
它工作正常,直到 0.83:
...
0.81
0.82
0.83
0.839999
0.849999
0.859999
0.869999
0.879999
0.889999
0.899999
0.909999
0.919999
0.929999
0.939999
0.949999
0.959999
0.969999
0.979999
0.989999
0.999999
Run Code Online (Sandbox Code Playgroud)
那部分怎么了?为什么所有额外的9s?
我跑的时候
printf("%.8f\n", 971090899.9008999);
printf("%.8f\n", 9710908999008999.0 / 10000000.0);
Run Code Online (Sandbox Code Playgroud)
我明白了
971090899.90089989
971090899.90089977
Run Code Online (Sandbox Code Playgroud)
我知道为什么两者都不准确,但我不明白为什么第二个与第一个匹配?
我认为基本的算术运算(+ - */)总是尽可能准确...
第一个数字不是第二个数字比第二个更精确的结果吗?
我一直在读浮点数,看看它们是什么,一个网站说这个.
物理学家需要在同一计算中同时使用光速(约300000000)和牛顿的引力常数(约0.0000000000667).为了满足工程师和芯片设计人员的需要,数字格式必须以非常不同的幅度提供数字的准确性.但是,只需要相对准确性.为了满足物理学家的要求,必须能够进行涉及不同数量的数字的计算.
基本上,具有固定数量的整数和小数位是没有用的 - 并且解决方案是具有浮点的格式.
我对第二段有两个问题.
floor((0.1+0.7)*10)正确(由于舍入误差*[源]计算为7,而不是8 ),它如何适用于从非常高到非常低的数字(如上面关于物理学家的引用),考虑到它无法使用0.1 - 8prev示例中的数字来计算正确的答案.为什么物理学家使用浮点计算,为什么不像其他人一样使用精确小数?我被告知不要用它们来赚钱,所以为什么要把它们用于科学
另外,如果计算floor((0.1+0.7)*10)或0.1 + 0.2 (等于0.30000000000000004)是如此困难,但不是整数,为什么计算机不能只计算没有小数点的((01 + 07) * 10)和01 + 02,或者然后将其放回到答案中(添加小数点1位数)从南方离开)?我知道一个比我年轻的17岁的孩子正在编写一个编译成javascript的编程语言.为什么程序员不能想到从总和中删除小数点(如果使用小数或负数的算术很难计算),然后将小数点放回到最终答案中?由于他们的主要错误,0.15 + 0.15并且0.1 + 0.2如果他们与==或相互比较,可以返回为假>=.这绝对是疯狂!
*7.9999999999999991118 ....
floating-point ×10
c++ ×5
c ×2
division ×1
ieee-754 ×1
if-statement ×1
int ×1
java ×1
javascript ×1
math ×1
opengl ×1
precision ×1
scala ×1