如何在编译时检测 long double 是否具有扩展精度

问题描述 投票:0回答:4

在少数系统上,double 与 long double 相同。 如何在编译时检测 long double 是否比 double 具有扩展精度,并将其用于条件编译。

我看到 libgcc 中存在预定义的宏 SIZEOF_DOUBLESIZEOF_LONG_DOUBLE 但不能跨不同工具链移植。

有C方法可以做到这一点吗?

c gcc compilation conditional-compilation
4个回答
7
投票

您可以比较

DBL_MANT_DIG
LDBL_MANT_DIG
中的
float.h


2
投票

您可以测试例如

#if DBL_MANT_DIG < LDBL_MANT_DIG

或 float.h 中定义的类似值


0
投票

此问题的“正确”解决方案(许多项目使用的)是创建一个配置脚本。

配置脚本运行各种测试,包括编译和运行小程序以确定编译器和系统属性。然后,脚本将其结果写出为头文件或 makefile,或两者兼而有之。当然,你可以做任何你喜欢的事情。

有一些工具可以半自动地完成这类事情,但它们对你来说可能有点大材小用了。如果您想看一下,名称是 autoconfautomake。请注意,它们并不容易学习,但它们生成的配置脚本和 makefile 应该可以在任何平台上运行,只要它具有 unix 风格的 shell 和 GNU make。


-1
投票

你为什么想要

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 的答案中所建议的那样)。

© www.soinside.com 2019 - 2024. All rights reserved.