在少数系统上,double 与 long double 相同。 如何在编译时检测 long double 是否比 double 具有扩展精度,并将其用于条件编译。
我看到 libgcc 中存在预定义的宏 SIZEOF_DOUBLE 和 SIZEOF_LONG_DOUBLE 但不能跨不同工具链移植。
有C方法可以做到这一点吗?
您可以比较
DBL_MANT_DIG
和 LDBL_MANT_DIG
中的 float.h
。
您可以测试例如
#if DBL_MANT_DIG < LDBL_MANT_DIG
或 float.h 中定义的类似值
此问题的“正确”解决方案(许多项目使用的)是创建一个配置脚本。
配置脚本运行各种测试,包括编译和运行小程序以确定编译器和系统属性。然后,脚本将其结果写出为头文件或 makefile,或两者兼而有之。当然,你可以做任何你喜欢的事情。
有一些工具可以半自动地完成这类事情,但它们对你来说可能有点大材小用了。如果您想看一下,名称是 autoconf 和 automake。请注意,它们并不容易学习,但它们生成的配置脚本和 makefile 应该可以在任何平台上运行,只要它具有 unix 风格的 shell 和 GNU make。
你为什么想要
long double
?为了精度。因此,直接进入问题的核心并测试精度,由EPSILON
指定:
#include <float.h>
printf("Info: long double epsilon = %10.4Lg\n", LDBL_EPSILON);
if (LDBL_EPSILON > 1.2e-19) {
printf("Insufficient precision of long double type\n");
return 1;
}
这是运行时的测试,而不是配置或编译时的测试。
将其放入单元测试中,或放入要从 CMake 运行的小测试程序中(如 ams 的答案中所建议的那样)。