在一些系统上,double类型和long double 类型是相同的。如何在编译时检测 long double 的扩展精度是否高于 double,并将其用于条件编译?
我发现libgcc中存在预定义的宏 SIZEOF_DOUBLE 和 SIZEOF_LONG_DOUBLE,但这些宏在不同的工具链之间不可移植。
有没有C语言的方法来解决这个问题?
在一些系统上,double类型和long double 类型是相同的。如何在编译时检测 long double 的扩展精度是否高于 double,并将其用于条件编译?
我发现libgcc中存在预定义的宏 SIZEOF_DOUBLE 和 SIZEOF_LONG_DOUBLE,但这些宏在不同的工具链之间不可移植。
有没有C语言的方法来解决这个问题?
float.h
中比较 DBL_MANT_DIG
和 LDBL_MANT_DIG
。#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所提出的答案)。
sizeof(double) > 8
。虽然这种方法也不是完全可移植的,但在大多数情况下它仍然有效。 - Mysticialsizeof(double) < sizeof(long double)
吗?还是我漏了什么? - Seth Carnegiesizeof
。 - Keith Thompson