Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 浮点错误 我的C++代码中有一个奇怪的错误: float cosTheta = someFunction(); cout << cosTheta << endl; // prints 1 on the console if (cosTheta == 1) { // doesn't enter this condition cout << "it is 1" << endl; } float sinTheta = sqrt(1 - pow(cosTheta, 2)); return (someVariable * sinTheta); float cosTheta=someFunction(); cout_Java_C++_Floating Point_Cout - Fatal编程技术网

Java 浮点错误 我的C++代码中有一个奇怪的错误: float cosTheta = someFunction(); cout << cosTheta << endl; // prints 1 on the console if (cosTheta == 1) { // doesn't enter this condition cout << "it is 1" << endl; } float sinTheta = sqrt(1 - pow(cosTheta, 2)); return (someVariable * sinTheta); float cosTheta=someFunction(); cout

Java 浮点错误 我的C++代码中有一个奇怪的错误: float cosTheta = someFunction(); cout << cosTheta << endl; // prints 1 on the console if (cosTheta == 1) { // doesn't enter this condition cout << "it is 1" << endl; } float sinTheta = sqrt(1 - pow(cosTheta, 2)); return (someVariable * sinTheta); float cosTheta=someFunction(); cout,java,c++,floating-point,cout,Java,C++,Floating Point,Cout,您不应该将浮点数与=进行比较。浮点运算中的舍入错误意味着您应该选择精度ε(与您的情况相当),并按如下方式使用: const float EPSILON = 0.00001; if( fabs(cosTheta - 1) < EPSILON ) { cout << "It is approximately 1\n"; } const float EPSILON=0.00001; if(fabs(cosTheta-1)

您不应该将浮点数与
=
进行比较。浮点运算中的舍入错误意味着您应该选择精度
ε
(与您的情况相当),并按如下方式使用:

const float EPSILON = 0.00001;

if( fabs(cosTheta - 1) < EPSILON ) {
    cout << "It is approximately 1\n";
}
const float EPSILON=0.00001;
if(fabs(cosTheta-1)在发布此问题之前,您是否尝试过搜索任何内容?是否输入了标题“浮点错误”进入谷歌?你确定
cosTheta
确实是1,而不是,比如说,0.9999999,只是为了显示而四舍五入到1吗?我不确定,它不完全是1,可能是0.99…让我沮丧的是,在Java中我正好得到1…你可能想写
pow(cosTheta,2)
as
cosTheta*cosTheta
。由于各种原因,它会更好,但您的编译器可能不会自动将其中一个编译为另一个。不过,这与您感觉到的问题无关。我理解这一点,但为什么我在Java中得到的正好是1,所以sinTheta得到0。您的Java实现可能使用的是更大的(更精确)浮点变量或您的
someFunction
的Java实现由于某种原因泄漏的精度较低…是的,在Java中我使用double。但是为什么更高的精度会有帮助?除非您告诉我们
someFunction()的秘诀是什么,否则我们无法知道这一点
…简而言之:浮点运算中的每个操作都会泄漏一些精度。如果执行
0.000383+0.292
,则结果可能在
0.292383
0.001
范围内,也可能不在
0.292383
范围内,具体取决于所使用的精度。而浮点错误是累积的,因此对于在
someFunction()中执行的每个浮点运算
,它的整体精度会下降…试试C++的
加倍
s,然后告诉结果是什么!@user2500558-底线是:不要比较浮点值是否相等。即使在Java中,也不要这样做。对于任何使用二进制来近似实数的语言,不要这样做。这不是语言问题,而是C计算机科学一。