Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.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
C++;对于简单的算法,倍频程的结果不同 我有一个C++代码和一个倍频程,它们都计算同一个等式< /p> < C++ > /P> #include <math.h> int main() { float x = 1.5f; float y = pow(x, 6) * 235809835.41f - pow(x, 5) * 2110439254.2f + pow(x, 4) *7869448124.8f - pow(x, 3) * 15648965509.0f + pow(x, 2) * 17503313074.0f - (x)* 10440563329.0f + 2594694745.0f; // result y = 3584 return 0; }_C++_Math_Floating Point_Octave_Pow - Fatal编程技术网

C++;对于简单的算法,倍频程的结果不同 我有一个C++代码和一个倍频程,它们都计算同一个等式< /p> < C++ > /P> #include <math.h> int main() { float x = 1.5f; float y = pow(x, 6) * 235809835.41f - pow(x, 5) * 2110439254.2f + pow(x, 4) *7869448124.8f - pow(x, 3) * 15648965509.0f + pow(x, 2) * 17503313074.0f - (x)* 10440563329.0f + 2594694745.0f; // result y = 3584 return 0; }

C++;对于简单的算法,倍频程的结果不同 我有一个C++代码和一个倍频程,它们都计算同一个等式< /p> < C++ > /P> #include <math.h> int main() { float x = 1.5f; float y = pow(x, 6) * 235809835.41f - pow(x, 5) * 2110439254.2f + pow(x, 4) *7869448124.8f - pow(x, 3) * 15648965509.0f + pow(x, 2) * 17503313074.0f - (x)* 10440563329.0f + 2594694745.0f; // result y = 3584 return 0; },c++,math,floating-point,octave,pow,C++,Math,Floating Point,Octave,Pow,在这两种情况下,y的计算值不同。C++计算Y为3584,倍频程计算Y为26。这种分歧的原因可能是什么 编辑:Excel生成与倍频程相同的结果,并且该结果在等式上下文中也是合乎逻辑的。因此,C++代码或编译器有点不对。 < P>这是由于浮点< /C>类型的有限精度,这可能导致操作之一被有效丢弃,因为一个操作数的大小比另一个操作数小,导致结果发生重大变化。(请参见下面的说明。) 如果您重写代码以使用更精确的double类型,那么它与我在Maxima中计算公式得到的结果相匹配 进一步阅读:这似乎是由于

在这两种情况下,y的计算值不同。C++计算Y为3584,倍频程计算Y为26。这种分歧的原因可能是什么


编辑:Excel生成与倍频程相同的结果,并且该结果在等式上下文中也是合乎逻辑的。因此,C++代码或编译器有点不对。

< P>这是由于浮点< /C>类型的有限精度,这可能导致操作之一被有效丢弃,因为一个操作数的大小比另一个操作数小,导致结果发生重大变化。(请参见下面的说明。)

如果您重写代码以使用更精确的
double
类型,那么它与我在Maxima中计算公式得到的结果相匹配


进一步阅读:

这似乎是由于
float
类型的精度有限,这可能导致一个操作被有效地丢弃,因为一个操作数的大小比另一个操作数小,从而导致结果发生重大变化。(请参见下面的说明。)

如果您重写代码以使用更精确的
double
类型,那么它与我在Maxima中计算公式得到的结果相匹配


进一步阅读:

FWIW,最大值显示结果为26.810782909331。不确定四度音阶正在做什么……很可能你会因为C++的取消而在C++中有很大的精度损失,而八度音阶可以用扩展的精度来计算,或者重排运算的顺序。是否舍入到最低值?像235809835.41f这样的常量没有意义(编译器应该发出警告)。在单精度浮点(float)中,有效位的精度为24位,约为7位十进制数字。使用双精度(双精度,无f后缀)。你的表达式也是病态的。FWIW,Maxima显示结果为26.810782909331。不确定四度音阶正在做什么……很可能你会因为C++的取消而在C++中有很大的精度损失,而八度音阶可以用扩展的精度来计算,或者重排运算的顺序。是否舍入到最低值?像235809835.41f这样的常量没有意义(编译器应该发出警告)。在单精度浮点(float)中,有效位的精度为24位,约为7位十进制数字。使用双精度(双精度,无f后缀)。你的表情也很病态。
x = 1.5
y = (x ^ 6) * 235809835.41 - (x ^ 5) * 2110439254.2 + (x ^ 4) *7869448124.8 - (x ^ 3) * 15648965509 + (x ^ 2) * 17503313074 - (x)* 10440563329 + 2594694745‏ // result y = 26