了解双整数转换中的 int-vs-trunc 关系

Posted

技术标签:

【中文标题】了解双整数转换中的 int-vs-trunc 关系【英文标题】:understand int-vs-trunc relation in double-to-int conversion 【发布时间】:2019-09-17 12:42:37 【问题描述】:

当我运行以下代码时

#include <iostream>
#include <cmath>

using namespace std;

int main()

    enum  FACTOR = 3 ;
    double d = 1.0 / FACTOR;
    double d_i = int(d * FACTOR);
    int i_t = std::trunc(d * FACTOR);
    double d_r = std::round(d * FACTOR);
    cout << d_i << " vs " << i_t << " vs " << d_r << endl;
    return 0;

在 Code::Blocks 17.12 IDE 中(使用我认为/希望的全包工具),我得到了这些令人困惑的结果:

0 vs 1 vs 1

我尝试更改编译器,但没有任何改变。最后我安装了 MinGW-64 版本 8.1.0。

我的构建日志显示

-------------- Clean: Debug in truncint (compiler: MinGW-w64-32bit)---------------

Cleaned "truncint - Debug"

-------------- Build: Debug in truncint (compiler: MinGW-w64-32bit)---------------

g++.exe -Wall -fexceptions -std=c++11 -g -std=c++11  -c C:\Users\[...]\truncint\main.cpp -o obj\Debug\main.o
g++.exe  -o bin\Debug\truncint.exe obj\Debug\main.o   
Output file is bin\Debug\truncint.exe with size 65.53 KB
Process terminated with status 0 (0 minute(s), 0 second(s))
0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

但奇怪的结果仍然存在。这可能是什么原因?

遗憾的是,这似乎无法通过在线编译器重构。

https://coliru.stacked-crooked.com/a/3fb36ba43dcbc36f https://ideone.com/fWo0a3 https://ideone.com/f0LpTU https://rextester.com/ORSOH1552 https://rextester.com/MCCS96488

【问题讨论】:

【参考方案1】:

事实证明,奇怪的结果仅限于 Debug 构建。

如果我切换到Release,输出与VS 2019和我测试的所有在线编译器相同:

1 vs 1 vs 1

我不确定这是否可以作为答案,但更改构建目标解决了我的实际问题。

【讨论】:

以上是关于了解双整数转换中的 int-vs-trunc 关系的主要内容,如果未能解决你的问题,请参考以下文章

舍入双精度值并转换为整数

Pyspark 在返回 0 的双精度数上转换整数

程序设计:此程序功能将输入的十进制整数num(num<=65535)转换为二进制(双字节,16位)输出。

如何在R中将两个变量(整数)转换为双精度?

将字符串转换为整数或双精度数

正则表达式删去双引号vscode