C 构建器忽略了STD ::修复了大数字

C++ Builder ignores std::fixed for big numbers

本文关键字:数字 构建 STD      更新时间:2023-10-16

请考虑以下程序,该程序旨在将浮点数打印到三个小数点位置:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
int main() {
    double val = 1.234567890e50;
    std::stringstream ss;
    ss << std::fixed << std::setprecision(3);
    ss << val;
    std::cout << ss.str() << std::endl;    
    return 0;
}

这个数字不能完全表示为双重,但这是无关紧要的。

在GCC 5.1上,程序打印

12345678900000000000046710074539164322570015270366608512.000

在Embarcadero C 建造器10.1(编译器BCC32C版本3.3.1)上,输出为:

1.234567890000000000470000000000000000000000000E 50

为什么C 构建器输出不匹配所选的浮点符号,哪个是std::fixed?即使数字为10^300,GCC也使用选定的符号表示。

为什么这两个编译器的工作方式不同?C 标准是否在这种情况下定义字符串转换应如何工作?

embarcadero c 建筑商10.1有一个错误。

std::setprecision(3);设置了在之后显示的数字数量,将小数分隔符到恰好 3,无论该平台上的浮点方案是否可以表示该数字。

gcc5.1符合此。

Embarcadero C 建筑商10.1不是。

请参阅http://en.cppreference.com/w/cpp/io/manip/setprecision,几乎可以代表C 标准。