C++ 将浮点转换为无符号短时的舍入问题
将浮点转换为无符号整数时,我得到了错误的值C++ 将浮点转换为无符号短时的舍入问题,c++,c,visual-c++,C++,C,Visual C++,将浮点转换为无符号整数时,我得到了错误的值 TMAC_PAYLOAD_SCALE = 0.10 Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE); 189.20/0.10 = 1891 (I am expecting 1892) 184.59/0.10 = 1845 (I am expecting 1846) 尝试了圆和CEL函数,但仍然得到错误的答案< P>如果C++编译器可以尝试函数: Data = (unsigned short)
TMAC_PAYLOAD_SCALE = 0.10
Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE);
189.20/0.10 = 1891 (I am expecting 1892)
184.59/0.10 = 1845 (I am expecting 1846)
尝试了圆和CEL函数,但仍然得到错误的答案
< P>如果C++编译器可以尝试函数:Data = (unsigned short)round(mData / TMAC_PAYLOAD_SCALE);
然而,假设除法结果为非负,以下方法可能更好:
Data = (unsigned short)(mData / TMAC_PAYLOAD_SCALE + 0.5);
原因是对于浮点积分转换,分数部分被丢弃。因此,如果舍入函数不能表示精确的整数值N
,并且返回的值“略小于”于N
,则在进行强制转换后,我们得到N-1
以下(IEEE 754兼容)代码可说明此问题:
虽然在IEEE 754和round
函数的情况下不应该出现所描述的问题(因为round
返回double
,它允许整数的精确表示),但是第一种方法看起来不是很方便,因为我们必须记住所有这些假设。我所尝试的-
#include <stdio.h>
#include<math.h>
int main ()
{
printf("%hd\n",(unsigned short)ceil(189.20/0.10)); // you can use ceilf also
printf("%hd\n",(unsigned short)floor(184.59/0.10));
return 0;
}
round
应该给出正确的结果-您确定正确使用了它吗?(我第一次用圆形,第二次也用圆形)。在第一种情况下,需要舍入仅仅是因为浮点计算的乐趣:10.0*189.20给出了正确的答案。在第二种情况下,这是由于强制转换以某种方式截断了数据,因此1845.9变为1845。@PaulR在VC为yes的情况下。但是,一般来说,double
(由round
返回)类型不能保证是IEEE 754,也不能保证所有整数都能精确表示。因此,我们可能会遇到截断后的结果低于预期的情况。(我试着在我的回答中用float
来说明这一点。)我确实喜欢这个Data=round(mData)*100)/100@Sijith您需要舍入“/”运算的结果,而不是一个参数。(括号不平衡。)@Sijith I更新答案,您也可以查看第二个选项。
16777217 16777216
#include <stdio.h>
#include<math.h>
int main ()
{
printf("%hd\n",(unsigned short)ceil(189.20/0.10)); // you can use ceilf also
printf("%hd\n",(unsigned short)floor(184.59/0.10));
return 0;
}
root@sathish1:~/My Docs/Programs# ./a.out
1892
1845