问题是整数截断.. 你正在除两个整数 => 结果将是另一个整数,小数部分被丢弃。 (例如,当整数除法的实际结果为 3.9 时,截断将使其变为 3(即不舍入))。
在您的情况下,如果您将其更改为:
x2 = 360 / 4095.0; /* one of the operands now has a decimal point */
你会得到
0.087912, 0.087912
作为输出。
即,一旦之一或两者除法运算符的操作数/
是 float/double,结果也会是(即,它将被“提升”为 float/double)。所以我本可以改变x2
to
x2 = 360.0 / 4095.0;
or
x2 = 360.0 / 4095;
并且会得到与上面相同的结果。
正如 @chris 所提到的,只是使用.
也足够了。
关于您上面关于精度的问题:
你已经在使用长双打了..我认为在内部你不能改变任何东西,除非你使用一些特殊的库,但你当然可以显示更多的数字。例如。,
printf("%Lf, %.20Lf \n",x1, x2);
将产生
0.087912, 0.08791208791208791895
最后,正如 @edA-qa mort-ora-y 提醒我们的,您还可以cast某些类型的值,但这很重要when你做吧。一个简单的例子(请注意,这些值最终为float
after任何情况下的分配v
is a float
):
float v = 0;
/* values shown are BEFORE assignment */
v = (5 / 2); /* value is 2 due to integer truncation before assignment */
v = (float) (5 / 2); /* 2.0 as integer division occurs 1st, then cast to float */
v = (float) 5 / 2; /* 2.5 since 5 becomes 5.0 through casting first. */