C++数学问题和 5/4*pi 与 5*pi/4
C++ mathematical problem and 5/4*pi vs 5*pi/4
#define M_PI acos(-1.0)
int main()
{
double z1 = sin(M_PI / 2 + 3 * x) / (1 - sin(3 * x - M_PI));
double z2 = 1 / tan(5 * M_PI / 4 + 3 * x / 2); // line 14
double z3 = 1 / tan(5 / 4 * M_PI + 3 * x / 2); // line 15
printf("%lf, %lf, %lf, z1, z2, z3);
}
正如您在 14 行和 15 行中看到的那样,我们有非常相似的表达式。那么为什么我们会得到不同的结果呢?
5 / 4 * M_PI
被分组为(5 / 4) * M_PI
,5 / 4
以整数算术计算,即1
。
以另一种方式写入它强制将其他系数转换为浮点数。
(最后一点,任何常见的浮点方案(包括IEEE754(都不保证华丽的定义#define M_PI acos(-1.0)
在您的平台上浮点类型允许的精度范围内恢复 pi 的数学值。最好写成手写。
这是因为以下两种操作不同:
5 * M_PI / 4
和
5 / 4 * M_PI
操作从左到右执行。
在第一行,5 * M_PI (int * float( 返回一个浮点数 (15.7...(,该浮点数除以返回浮点数 (3.9...( 的 int (float/int(。
在第二行,5/4 返回等于 1 的 int (int/int(,然后乘以 M_PI (int * float( 返回浮点数,返回正好M_PI (3.14...(
这是不同的结果。
由于/
和*
具有相同的运算符优先级,因此表达式的计算取决于关联性。关联性指示在表达式中应用相同优先级的运算符的顺序。这里的关联性是从左到右的。请参阅运算符优先级表。
因此5 / 4 * M_PI
是(5 / 4) * M_PI
,(5 / 4)
是整数除法,计算结果为 1。 而5 * M_PI / 4
是(5 * M_PI) / 4
,这会导致浮点除法,因为5 * M_PI
是一个浮点值。
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- C++数学问题和 5/4*pi 与 5*pi/4
- Windows到Raspberry Pi Zero串行问题
- Raspberry Pi 3 B时钟问题使用.TV_USEC
- 我遇到了一个关于多线程的小问题.需要多线程来计算 Pi 和方差