在不遵循IEEE浮点标准的机器上,C如何知道DBL_EPSILON的数值?
我在努力解决这个 问题 中作者提出的要求,即在不使用宏的情况下把 DBL_EPSILON 的值便携地计算出来。我的解决方案:
#include <stdio.h>
int main(void)
{
double one = 1, next = 1, zero = -0.0;
unsigned char * ptr_next = (unsigned char *)&next, * ptr_zero = (unsigned char *)&zero;
int endianness;
if (ptr_zero[7] >> 7) endianness = 0;
if (ptr_zero[0] >> 7) endianness = 7;
ptr_next[endianness] |= 1;
printf("DBL_EPSILON = %e", (next - one));
return 0;
}
我通过确定 -0.0 的 1 位所在的位置来判断机器的字节序。我接着把 one 的尾数增加 1,得到紧随 one 的那个浮点数。随后我通过相减求出了 DBL_EPSILON 的值。IEEE浮点数规范告诉我如何在 one 之后找到下一个浮点数。我的问题是:在不遵循IEEE规范的机器上,C语言是如何知道 DBL_EPSILON 的值,或者如何知道下一个浮点数是什么?我不认为这是硬编码的,因为非IEEE浮点数规范的版本可能多达2^64 - 1种?
解决方案
C实现知道 DBL_EPSILON 的值的常规方式是:由一个或多个人为某台机器设计一个C 实现(或改造现有实现)。他们阅读该机器的文档,并从文档中判断该机器上 DBL_EPSILON 的值应该是多少。然后他们编写 <float.h> 头文件,使 DBL_EPSILON 具有该值。
有时一个C 实现的头文件是由相对可移植的头文件和定制头文件混合组成,或者在此基础上构建,因此将C 实现移植到新机器的人不会从头开始编写 <float.h> 头文件。尽管如此,他们仍然会提供描述目标机器的输入值,以便能够构建 <float.h> 头文件。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。