gpt4 book ai didi

c - 为什么带有 DBL_MIN 的 strtod() 给出 ERANGE?

转载 作者:太空狗 更新时间:2023-10-29 16:05:47 26 4
gpt4 key购买 nike

此程序在第一个命令行参数上调用 strtod() 并打印返回值:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <float.h>

int main(int argc, char **argv)
{
errno = 0;
double d = strtod(argv[1], NULL);
int errno_sav = errno;

printf("string = %s\n", argv[1]);
printf("d = %.*e = %a\n", DBL_DIG + 2, d, d);
printf("errno = %d\n", errno_sav);
printf("DBL_MIN = %.*e = %a\n", DBL_DIG + 2, DBL_MIN, DBL_MIN);
return 0;
}

当我在 SUSE Linux Enterprise Server 11 SP2 或 Linux Mint 17 Qiana 上使用参数 2.22507385850720138309e-308 运行它时,对应于最小的可表示1 double 值(DBL_MIN),它给出了我期望的输出:

string = 2.22507385850720138309e-308
d = 2.22507385850720138e-308 = 0x1p-1022
errno = 0
DBL_MIN = 2.22507385850720138e-308 = 0x1p-1022

但是,在具有相同参数2 的 SUSE Linux Enterprise Server 11 SP3 上,errno 设置为 ERANGE:

string = 2.22507385850720138309e-308
d = 2.22507385850720138e-308 = 0x1p-1022
errno = 34
DBL_MIN = 2.22507385850720138e-308 = 0x1p-1022

第二种行为是否有效,如果有效,为什么?


脚注:

  1. 由于 DBL_MIN 是可表示的,所以我认为这个问题不同于“Odd behavior when converting C strings to/from doubles”,后者的转换值已下溢。

  2. 在 SUSE 上,如果我使用 2.22507385850720138310e-308 参数运行程序,则 errno 设置为 0。(如果我使用 0x1p 参数运行程序-1022 然后 errno 也设置为 0。)

最佳答案

输入值 2.22507385850720138309e-308 小于 DBL_MIN 的精确值 (2-1022)。更大的十进制展开式是:

2.225073858507201383090232717332404064219215980462331830553327416887204434813918...e-308 v.
2.22507385850720138309e-308

所以从技术上讲,这会导致下溢。

C 1999 (7.20.1.3) 声明在这种情况下:

If the result underflows (7.12.1), the functions return a value whose magnitude is no greater than the smallest normalized positive number in the return type; whether errno acquires the value ERANGE is implementation-defined.

关于c - 为什么带有 DBL_MIN 的 strtod() 给出 ERANGE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42005462/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com