gpt4 book ai didi

c++ - 四倍精度的 Epsilon (gcc)

转载 作者:行者123 更新时间:2023-12-02 03:07:04 27 4
gpt4 key购买 nike

根据维基百科,不同精度数据类型的布局是

我写了一个小程序来输出C++中floatdoublelong double的数值限制(用g++编译)

#include<iostream>
#include<limits>
#include<string>

template<typename T>
void print(std::string name) {
std::cout << name << " (" << sizeof(T) * 8 << "): " << std::numeric_limits<T>::epsilon() << "\t" << std::numeric_limits<T>::min() << "\t" << std::numeric_limits<T>::max() << std::endl;
}

int main() {
std::cout.precision(5);
print<float>("float");
print<double>("double");
print<long double>("long double");
return 0;
}

输出(我在多台机器上运行它,结果相同)

float (32): 1.1921e-07  1.1755e-38  3.4028e+38
double (64): 2.2204e-16 2.2251e-308 1.7977e+308
long double (128): 1.0842e-19 3.3621e-4932 1.1897e+4932

上限与 2^(2^(e-1)) 一致,对于 floatdouble,epsilon 与 2^(-f) 一致。然而,对于 long double,按照该逻辑,epsilon 应该大约为 1.9259e-34。

有人知道为什么不吗?

最佳答案

long double不保证实现为 IEEE-745 四倍精度。 C++ reference reads :

long double - extended precision floating point type. Does not necessarily map to types mandated by IEEE-754. Usually 80-bit x87 floating point type on x86 and x86-64 architectures.

如果long double实现为 80-bits x86 extended precision ,则 epsilon 为 2<sup>-63</sup> = 1.0842e-19 。这是您获得的输出值。

一些编译器 support __float128具有四倍精度的类型。在海湾合作委员会 long double成为 __float128 的别名如果-mlong-double-128使用命令行选项,并且在 x86_64 目标上 __float128guaranteed为 IEEE 四倍精度类型(以软件实现)。

std::numeric_limits不专门用于__float128 。要获取 epsilon 的值,可以使用以下技巧(假设是小端机器):

__float128 f1 = 1, f2 = 1;      // 1.q       -> ...00000000
std::uint8_t u = 1;
std::memcpy(&f2, &u, 1); // 1.q + eps -> ...00000001
std::cout << double(f2 - f1); // Output: 1.9259e-34

使用 GCC,您可以使用 libquadmath :

#include <quadmath.h>
...

std::cout << (double)FLT128_EPSILON;

获得相同的输出。

关于c++ - 四倍精度的 Epsilon (gcc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59087594/

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