在PIC上使用long long时的舍入问题

在PIC上使用long long时的舍入问题,c,math,rounding-error,long-long,C,Math,Rounding Error,Long Long,我正在PIC微控制器上做一个简单的数学运算,用C语言运行代码,使用MPLABX和xc16编译器。代码如下: double mydouble = 0.019440; long long int mypower = 281474976710656; long long int result = mypower*mydouble; 打印出“结果”给我5471873794048;而它应该给出5471873547255。你知道是什么导致了这个问题吗?我怎样才能纠正它 谢谢默认情况下,xc16将doub

我正在PIC微控制器上做一个简单的数学运算,用C语言运行代码,使用MPLABX和xc16编译器。代码如下:

double mydouble = 0.019440;
long long int mypower = 281474976710656;

long long int result = mypower*mydouble;
打印出“结果”给我5471873794048;而它应该给出5471873547255。你知道是什么导致了这个问题吗?我怎样才能纠正它


谢谢

默认情况下,xc16将double和float处理为32位数据类型。您需要提供编译选项
-fno short double
以使用64位双精度

您也可以只使用
longdouble
作为数据类型,但我目前无法编译来验证这一点


(作为测试,5471873794048也是您在x86上使用
float
而不是
double
编译示例代码时得到的结果)

什么是
sizeof(double)
?很可能您的FPU仅限于32位计算。@keltar PIC(或我知道的任何其他微控制器)中没有FPU。值得注意的是,log2(281474976710656)是48位,因此任何精度低于48位的FP表示法都无法准确表示。SPFP有24和DP 53,因此如果/当他的
mypower
超过2^53(大约9e15),他将再次遇到与DP相同的问题。@Emmet很抱歉,你的首字母缩略词让我看不到,FP和SPFP以及DP是什么?它不喜欢使用long double作为数据类型,但我现在只是更改编译选项,所以我会让您知道这是怎么回事…@edipo99 SPFP==单精度浮点,DP==双精度。非常成功!!在xc16编译器中启用64位双精度对我来说解决了这个问题,根本不需要对代码进行任何更改。非常感谢@JoachimGood luck。当我对图片进行编程时,它们甚至没有中断,更不用说FPU了:)