我正在开发一个库,试图以跨平台的方式实现一个扩展的C标准,为此使用了各种默认的编译器。我在处理扩展精度的时候遇到了一个障碍 与 四倍精度的Mac OS X。
GCC家族的编译器有宏。__float80
和 __float128
为我很好地处理了这个问题,但默认的 Mac OS X clang 编译器似乎没有对应的版本。
版本信息。
Apple clang version 11.0.0 (clang-1100.0.33.16)
Target: x86_64-apple-darwin19.3.0
Thread model: posix
此外,一些测试让我了解到 long double
和 1.0L
在Mac上都默认为Float 128(大小为16)。我知道Float 80是x86定义的,而Swift似乎支持Float 80扩展精度,所以Mac上一定有办法处理它们。不过我找了一大堆,也没找到方法。感谢任何帮助或链接。
下图所示的程序在macOS 10.14.6上打印了这个苹果Clang 11.0.0。
长双格式: 在其意义上有64个基数2的数字, 并且有正常的指数从-16382(包括)到16384(不包括)。
这表明它使用的是英特尔80位的格式。long double
. 事实是: sizeof
显示为16个字节只是说明80位(10个字节)保存在16个字节的容器中,方便对齐什么的。
#include <float.h>
#include <stdio.h>
int main(void)
{
printf("The long double format:\n");
printf("\thas %d base-%d digits in its significand, and\n",
LDBL_MANT_DIG, FLT_RADIX);
printf("\thas normal exponents from %d (inclusive) to %d (exclusive).\n",
LDBL_MIN_EXP-1, LDBL_MAX_EXP);
}