我刚刚读到 C99 的 double_t 应该至少和 double 一样宽。这是否意味着它在小数点后给出了更精确的数字?比通常的 15 位多双倍?。
二、使用方法:只包括
#include <float.h>
足够?我读到必须将 FLT_EVAL_METHOD 设置为 2 以获得长双精度。这该怎么做?当我使用数值方法时,我希望在不使用任意精度库的情况下获得最大精度。
非常感谢...
No. 至少与 double 一样double_t
宽;即,它可能与双倍相同。C99 标准中的脚注 190 明确了意图:
float_t 和 double_t 类型旨在成为实现中最有效的类型,至少分别与 float 和 double 一样宽。
正如迈克尔伯尔所说,你不能设置FLT_EVAL_METHOD
.
如果您想在仅使用 C99 的任何系统上获得最宽的浮点类型,请使用long double
. 请注意,在某些平台上,它将与double
(甚至可能与float
)相同。
此外,如果您“使用数值方法”,您应该知道,对于许多(大多数偶数)数值方法,该方法的近似误差远大于双精度的舍入误差,因此使用更宽的方法通常没有任何好处类型。当然也有例外。你正在研究什么类型的数值方法,具体来说?
编辑:严肃地说,要么(a)只使用long double
并称它为一天,要么(b)花几周时间来了解浮点是如何在您的目标平台上实际实现的,以及实际的准确性要求是什么您正在实施的算法。
请注意,您不必设置FLT_EVAL_METHOD
- 它由编译器的头文件设置,让您确定库如何使用浮点执行某些操作。
如果您的代码对浮点运算的执行方式非常敏感,您可以使用该宏的值来有条件地编译代码以处理可能对您很重要的差异。
因此,例如,通常您知道在所有情况下都double_t
至少是 a 。double
如果你想让你的代码做一些不同的事情 if double_t
is along double
那么你的代码可以测试 ifFLT_EVAL_METHOD == 2
并采取相应的行动。
请注意,如果FLT_EVAL_METHOD
不是 0、1 或 2,您需要查看编译器的文档以确切了解类型double_t
是什么。
double_t
可以定义为typedef double double_t;
——当然,如果您计划依赖实现细节,您需要查看您自己的实现。