gpt4 book ai didi

c++ - IEEE 754/IEC 559

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:31 29 4
gpt4 key购买 nike

IEEE 754 浮点格式是否跨平台定义明确?在位格式和字节顺序方面?

我愿意将以下内容添加到我的代码中(对于初始版本):

static_assert(std::numeric_limits<float>::is_iec559, "Only support IEC 559 (IEEE 754) float");
static_assert(sizeof(float) * CHAR_BIT == 32, "Only support float => Single Precision IEC 559 (IEEE 754)");

static_assert(std::numeric_limits<double>::is_iec559, "Only support IEC 559 (IEEE 754) double");
static_assert(sizeof(float) * CHAR_BIT == 64, "Only support double => Double Precision IEC 559 (IEEE 754)");

static_assert(std::numeric_limits<long double>::is_iec559, "Only support IEC 559 (IEEE 754) long double");
static_assert(sizeof(float) * CHAR_BIT == 128, "Only support long double => Exteneded Precision IEC 559 (IEEE 754)");
// More asserts if required.
// I noticed my current system has a sizeof(long double) => 128
// But numeric_limits<long double>::digits => 63
// So we are not storing quad precision floats only extended.

如果我以二进制格式编写我的 float/double/long double,这些可以在系统之间传输而无需进一步解释。即...

void write(std::ostream& stream, double value)
{
stream.write(reinterpret_cast<char const*>(&value), 8);
}

....

double read(std::istream& stream)
{
double value;
stream.read(reinterpret_cast<char*>(&value), 8);
return value;
}

或者我是否需要将 double 分解为整数部分以便传输(如 this answer 所建议):

这里的区别是我愿意将我支持的表示限制为 IEEE-754 这是否基本上解决了我的浮点值二进制存储问题,或者我是否需要采取进一步的步骤?

注意:对于不符合标准的平台(当我找到它们时),我愿意对代码进行特殊处理,以便它们将 IEEE-754 读/写到本地表示中。但我想知道 bit/endian 是否足够定义跨平台以支持存储/传输。

最佳答案

位格式定义明确,但并非所有机器都是小端格式。 IEEE 标准也不要求 float 是特定的字节序。您可以运行以下程序来查看 double 42.0 的字节模式:

#include <stdio.h>
#include <numeric>
#include <limits>
using namespace std;

int main() {
double d = 42;
printf("%i\n", std::numeric_limits<double>::is_iec559);
for (char *c = (char *)&d; c != (char *)(&d+1); c++) {
printf("%02hhx ", *c);
}
printf("\n");
}

在使用 g++ 3.4.5 的旧的、未维护的 Sun 机器上,打印

1
40 45 00 00 00 00 00 00

在运行更新的 g++ 的 x86_64 机器上:

1
00 00 00 00 00 00 45 40

关于c++ - IEEE 754/IEC 559,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28625340/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com