奇怪的浮动舍入

时间:2014-09-17 19:08:20

标签: c floating-point atmega

我正在编程微控制器atmega168(8位)。

我想做类似的事情:

float A =  cos(- (2/3) * M_PI);

当然包括math.h(#define M_PI 3.14159265358979323846)

结果,而不是-0.5,我得到1。

我使用与我的电脑的串行通信检查结果,我确信它也适用于浮点数,因为如果我设置

A= -0.50;

我收到了正确的结果。

PS。我不能使用双...也因为我没有看到这样做的原因

请帮帮我!

2 个答案:

答案 0 :(得分:6)

使用整数运算来评估

2/3。它的计算结果为0.你的意思是使用浮点除法

float A = cos(-(2.0/3.0) * M_PI);

如果您希望float文字使用f后缀:

float A = cos(-(2.0f/3.0f) * M_PI);

请注意,此处展开的M_PI宏是双字面值。这就是你想要的吗?

我认为真正的代码看起来不像这样。如果这确实是您的代码,那么您将编写float A = -0.5f并继续前进。我猜真正的代码有变量。

答案 1 :(得分:2)

您需要多少精确度,数字来自哪里?如果您的目标是计算120度的余弦值,只需将a设置为0.5即可。如果您的原始数字不表示为弧度,并且您不需要绝对精确的结果,则基于表格的近似可能比内置的trig函数更有用,因为您可以在表格大小,执行之间取得任何平衡速度和精度将最符合您的需求。另请注意,如果原始数字是整数,则可以在不使用任何浮点值的情况下计算trig函数[例如一个可以有一个接受0-65535角度的函数,并返回-16384到+16384的值。整数数学通常比浮点数快得多,所以这样的函数可能是一个主要的性能胜利。