如何解决无法解释的表达式结果
我目前正在从事一个项目,但由于“超出范围”、“内存访问冲突”和其他类似问题而陷入困境。花了很多时间试图找出问题的来源,我找到了这样一段微不足道的代码:
#include <iostream>
#define RANDOM(min,max) min + RAND_MAX / ((RAND_MAX - 1) / (max - min))
int main() {
std::cout << RANDOM(0,500) << std::endl;
}
一个编译器 clang
说 500
,这正是我希望它说的。另一个(gcc
我猜,我使用 VS2017)说 504
。后来我发现两者的 RAND_MAX
的值是不同的,如果我为 clang
指定相同的值,它也会显示 504
。这里 RAND_MAX
的值为 32767
。
我去我的 Python
shell 手动计算表达式。所以我输入了
0 + 32767 / ((32767 - 1) / (500 - 0))
并得到结果500.015259720442
。这不是504
。怎么可能?
解决方法
这种差异是由于这两种语言处理十进制数的方式不同造成的。
当您的代码中有自然数时,C++ 编译器将默认使用 int 类型。但是,由于 int 类型不允许十进制数,因此每次您在代码中进行除法以产生十进制数时,它都会向下舍入到最接近的单位。
另一方面,Python 没有这个问题。
要指定要在代码中使用双精度数,可以执行以下操作:
std::cout << 0 + 32767.0 / ((32767.0 - 1) / (500.0 - 0));
,
这是整数运算。 32766/64 是 65。32767/65 是 504。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。