繁体   English   中英

IEEE 754浮点数的有效数字

[英]significant digits with IEEE 754 float

Wiki 双精度浮点格式表示:

这样可以提供15-17个有效的十进制数字精度。 如果将最多具有15个有效数字的十进制字符串转换为IEEE 754双精度表示形式,然后再转换回具有相同有效数字数量的字符串,则最终字符串应与原始字符串匹配。 如果将IEEE 754双精度转换为具有至少17个有效数字的十进制字符串,然后再转换回双精度,则最终数字必须与原始数字匹配。

谁能给我一些例子来说明转换如何与原始转换匹配,在哪种情况下不匹配?

15位有效数字,从字符串到双精度数字,然后从反斜杠...

std::istringstream iss("0.123456789012345");
double d;
iss >> d;
std::ostringstream oss;
oss << std::fixed << std::setprecision(15) << d;
std::cout << "should be 0.123456789012345 but might have changed: " << oss.str() << '\n';

注意:对于大约15个有效数字的初始输入字符串,以上代码可能输出不同的最终字符串。 下面是试图找到值不保留通过转换和从一个针对15位字符串输入程序double ,但所有的值传递对coliru.stackedcrooked.com GCC 这并不意味着对于其他范围内的其他值也不会失败。

#include <sstream>
#include <iostream>
#include <iomanip>

int main()
{
    int results = 0;

    for (unsigned long i = 0; i <= 999999999999999; ++i)
    {
        std::ostringstream oss;
        oss << "0." << std::setfill('0') << std::setw(15) << i;
        std::istringstream iss(oss.str());
        double d;
        iss >> d;
        std::ostringstream oss2;
        oss2 << std::fixed << std::setprecision(15) << d;
        if (oss.str() != oss2.str())
        {
            std::cout << "from " << oss.str() << '\n' << "  to " << oss2.str() << '\n';
            if (++results > 50) exit(0);
        }
    }
}

具有17位有效数字,从双精度到字符串,然后从反位...

double d = 0.12345678901234567;
std::ostringstream oss;
oss << std::fixed << std::setprecision(17) << d;
std::istringstream iss(oss.str());
double d2;
iss >> d2;
std::cout << "d must equal d2: " << std::boolalpha << d == d2 << '\n';

这应该永远不会从文本表示中恢复相同的double值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM