C++ Builder 忽略大数的 std::fixed
C++ Builder ignores std::fixed for big numbers
考虑以下程序,该程序旨在将浮点数打印到小数点后三位:
#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 上,程序打印
123456789000000004671007453916432257001527036608512.000
在 Embarcadero C++ Builder 10.1(编译器 bcc32c 版本 3.3.1)上,输出为:
1.234567890000000047000000000000000000000e+50
为什么 C++ Builder 输出与选定的浮点符号 std::fixed
不匹配?即使数字是 10^300,GCC 也会使用选定的符号显示它。
为什么这两个编译器的工作方式不同? C++ 标准是否定义了字符串转换在这种情况下的工作方式?
Embarcadero C++ Builder 10.1 有一个错误。
std::setprecision(3);
设置小数点分隔符后显示的位数为正好3,不管有无该平台上的浮点方案可以表示该数字。
GCC5.1 与此兼容。
Embarcadero C++ Builder 10.1 不是。
参见 http://en.cppreference.com/w/cpp/io/manip/setprecision,它几乎代表了 C++ 标准。
考虑以下程序,该程序旨在将浮点数打印到小数点后三位:
#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 上,程序打印
123456789000000004671007453916432257001527036608512.000
在 Embarcadero C++ Builder 10.1(编译器 bcc32c 版本 3.3.1)上,输出为:
1.234567890000000047000000000000000000000e+50
为什么 C++ Builder 输出与选定的浮点符号 std::fixed
不匹配?即使数字是 10^300,GCC 也会使用选定的符号显示它。
为什么这两个编译器的工作方式不同? C++ 标准是否定义了字符串转换在这种情况下的工作方式?
Embarcadero C++ Builder 10.1 有一个错误。
std::setprecision(3);
设置小数点分隔符后显示的位数为正好3,不管有无该平台上的浮点方案可以表示该数字。
GCC5.1 与此兼容。
Embarcadero C++ Builder 10.1 不是。
参见 http://en.cppreference.com/w/cpp/io/manip/setprecision,它几乎代表了 C++ 标准。