当前位置: 首页 > 知识库问答 >
问题:

IEEE 754浮点数的有效数字

贺经纶
2023-03-14

Wiki双精度浮点格式表示:

这给出了15–17位有效小数的精度。如果将最多包含15个有效数字的十进制字符串转换为IEEE 754双精度表示形式,然后再转换回包含相同有效数字的字符串,那么最终的字符串应该与原始字符串匹配。如果将IEEE 754双精度转换为至少有17位有效数字的十进制字符串,然后再转换回double,则最终数字必须与原始数字匹配。

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

共有1个答案

应安国
2023-03-14

有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位的字符串输入,其值不会通过与< code>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';

这应该可以从文本表示中恢复相同的< code>double值。

 类似资料:
  • 浮点是C语言中定义的实现,因此没有任何保证。 我们的代码需要可移植,我们正在讨论是否可以在协议中使用IEEE754浮动。出于性能考虑,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。 虽然我知道平台和架构之间在或的大小上可能存在差异。但我似乎找不到任何关于和的具体信息。 到目前为止,我发现在big endian平台上字节顺序可能会颠倒。虽然有些平台不支持浮点运算,但包含和的代码甚

  • 问题内容: 为什么单精度浮点数具有7位精度(或双精度15-16位精度)? 谁能解释一下如何根据为float(Sign(32)Exponent(30-23),Fraction(22-0))分配的32位来达到这个目标? 问题答案: 有效位的23个小数位(22-0)出现在内存格式中,但是总精度实际上是24位,因为我们假设有一个前导1。这等效于十进制数字。 双精度浮点数的分数为52位,加上前导1为53。因

  • 我最近一直在开发一个需要存储和加载大量数据的系统,包括单精度浮点值。我决定在网络上对整数的字节顺序进行标准化,并决定以big-endian格式存储浮点值,即: 理想情况下,我希望提供像和这样的函数,因为我已经将它们用于抽汲整数,并且我还希望以一种尽可能具有平台独立性的方式实现这一点(同时假设类型对应于IEEE754 32位浮点值)。是否有某种方法,可能使用,要这样做吗? 我有一个似乎有效的答案,我

  • 最近的一个问题,编译器是否允许用浮点乘法代替浮点除法,启发了我提出这个问题。 在严格要求代码转换后的结果应与实际除法运算在位上相同的情况下,很容易看出,对于二进制IEEE-754算法,除数为2的幂的除数也是可能的。只要除数的倒数是可表示的,乘以除数的倒数就会得到与除数相同的结果。例如,乘以0.5可以代替除以2.0。 然后,人们会想知道这种替换的其他除数还能起什么作用,假设我们允许任何替换除法但运行

  • 问题内容: 浮点数是否具有32个二进制数字,而双精度数是否具有64个二进制数字?该文档太难理解了。 所有位都转换为有效数字吗?还是小数点的位置占用了一些位? 问题答案: float:32位(4个字节),其中23位用于尾数(约7个十进制数字)。指数使用8位,因此浮点数可以使用这8位将小数点“移动”到右边或左边。这样做避免了像0.0000003(3×10 -7)或3000000(3×10 7)那样在尾

  • 问题内容: 我希望我的Python(2.4.3)输出数字具有某种格式。具体来说,如果数字是有效位数<= 6的终止十进制数,请全部显示。但是,如果它具有> 6个​​有效数字,则仅输出6个有效数字。 “ A”显示Python如何编写浮点数。“ B”表示我希望他们如何写作。如何以这种方式使Python格式化我的数字? 问题答案: 您将需要用于修饰符的修饰符,该修饰符会删除不重要的零; 抱歉,我的更新还包