Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将浮点转换为无符号短时的舍入问题_C++_C_Visual C++ - Fatal编程技术网

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