如果我定义这些变量:
double x0, xn, h;
int n;
我有这个数学表达式:
h = (xn - x0)/n;
是否有必要在进行除法之前将n投入双精度以获得最高精度,如
h = (xn - x0)/ (double) n;
我写了一个程序来检查上面的内容,但两个表达式给出了相同的答案。我理解C会将整数提升为double类型,因为变量xn和x0的类型为double,但在书中非常奇怪,强调了第二个带有强制转换的表达式。
我的问题是,如果我正在思考。
非常感谢...
答案 0 :(得分:3)
您的理解是正确的,您阅读的书籍有误或过于谨慎(例如声称您应该始终测试0 == x
而不是x == 0
的人)。没有强制转换的表达式应该总是给出与使用强制转换的表达式完全相同的结果。
答案 1 :(得分:2)
不,这种转换是不必要的,因为分子是double
。这也会将n
提升为double
。这本书可能会提到明确的演员是一个好习惯,因为如果xn
和x0
是int
s,那么表达式只会使用整数除法。
答案 2 :(得分:1)
在这种情况下没有必要。在您希望结果与操作数类型不同的情况下,通常需要它。典型的是在进行计时时。您通常会得到如下代码:double(end_time-start_time)/CLOCKS_PER_SEC;
在这种情况下,需要强制转换,因为所有输入都是(通常)整数类型,但您需要浮点结果。
答案 3 :(得分:1)
在C中,任何表达式的精度与表达式中涉及的最高精度常量/变量相同。
显式强制转换非常有用:
- 作为预防措施。
明天您可以编辑变量 使用整数的表达式。演员 仍然会返回正确的值
- 作为指南。
其他人引用/修改你的代码很容易理解你正在使用 double 。
即。 “让Ur代码成为自己的评论!!”