将 C 字符串转换为双精度数或从双精度数转换时出现奇怪的行为

2023-12-30

我无法理解 C 的规则,即在打印双精度数或将字符串转换为双精度数时应采用何种精度。下面的程序应该可以说明我的观点:

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

int main(int argc, char **argv) {
    double x, y;
    const char *s = "1e-310";

    /* Should print zero */
    x = DBL_MIN/100.;
    printf("DBL_MIN = %e, x = %e\n", DBL_MIN, x);

    /* Trying to read in floating point number smaller than DBL_MIN gives an error */
    y = strtod(s, NULL);
    if(errno != 0)
        printf("  Error converting '%s': %s\n", s, strerror(errno));
    printf("y = %e\n", y);

    return 0;
}

当我编译并运行这个程序(在带有 gcc 4.5.2 的 Core 2 Duo 上)时得到的输出是:

DBL_MIN = 2.225074e-308, x = 2.225074e-310
  Error converting '1e-310': Numerical result out of range
y = 1.000000e-310

我的问题是:

  1. 为什么 x 打印为非零数字?我知道编译器有时出于计算目的将双精度类型提升为更高精度的类型,但是 printf 不应该将 x 视为 64 位双精度类型吗?
  2. 如果 C 库秘密使用扩展精度浮点数,为什么 strtod 在尝试转换这些小数字时设置 errno?为什么它会产生正确的结果呢?
  3. 这种行为只是一个错误,是我的特定硬件和开发环境的结果吗? (不幸的是,我目前无法在其他平台上进行测试。)

谢谢你提供的所有帮助。当我收到反馈时,我会尽力澄清这个问题。


  1. 因为存在非正规数 http://en.wikipedia.org/wiki/Denormal_numbers在 IEEE-754 标准中。DBL_MIN是最小的归一化 value.

  2. 因为标准是这么说的(C99 7.20.1.3):

    如果 结果下溢(7.12.1),函数返回一个大小不大于的值 比返回类型中最小的标准化正数; errno 是否获取 值 ERANGE 是实现定义的。

    返回“正确”值(即 1e-310)遵循上述约束。

  3. 所以不是一个错误。这在技术上依赖于平台,因为 C 标准对非正规数 (AFAIK) 的存在或行为没有提出要求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 C 字符串转换为双精度数或从双精度数转换时出现奇怪的行为 的相关文章

随机推荐

  • React 暴露组件函数

    基于此链接上的示例http reactjs cn react tips expose component functions html http reactjs cn react tips expose component function
  • 带有列表项的 GWT 无序列表

    我完全坚持在 gwt 中创建 css 驱动的菜单 在渲染的结果中 它应该看起来完全像这样 div class topbar div class container fixed h3 a href class logo test a h3 u
  • 制作Python批处理文件

    如何创建一个bat文件来运行python文件 特别是包含pygame bat文件 Simple 只需将以下内容作为批处理文件的第一行 python x 0 goto eof 批处理文件的其余部分是 Python 程序 这是一个完整的例子 p
  • 捕获具有同一组的 和 (thisPartOnly)

    假设我们有以下输入
  • 在 JSF 中验证字段并抛出异常,但将错误消息附加到另一个字段?

    我的页面上有一些需要交叉验证的字段 但我不希望此验证中显示错误
  • 如何从球衣servlet中的curl请求中提取参数?

    我正在以表格形式向我的球衣 servlet 发出一个curl post Restful请求 curl i X POST d debit user id custome mobile number 917827448775 http loca
  • Hive 将 ORC 文件分割成小部分

    create table n data MARKET string CATEGORY string D map
  • 检测 Mono 中的符号链接和管道

    有没有办法使用 C 和 Mono 来区分特殊文件 例如符号链接和管道 该应用程序是一个多平台备份工具 因此我想避免使用互操作库或 C DLL 并寻找直接托管代码解决方案 经过更多研究后 我找到了解决方案 添加参考MonoPosix项目可以访
  • 图像未保存在文件夹中

    我正在尝试创建一个文件夹并在其中保存图像 但这不起作用 我不知道我的代码出了什么问题 你能告诉我为什么吗 The method that invoke of uploading images public void openGallery
  • 将 QLineEdit 设置为仅接受数字

    我有一个QLineEdit用户应仅输入数字 那么是否有一个仅限数字的设置QLineEdit QLineEdit setValidator 例如 myLineEdit gt setValidator new QIntValidator 0 1
  • Microsoft 的 CodeView 格式规范

    我一直在寻找 1990 年代的 Microsoft 文档 名为CodeView 符号调试信息规范 微软在他们的文章中引用了它PE COFF规格 http elfz laacz lv ms exe spec html L61 关于该文档的信息
  • 如何通过VSTS构建和部署SSRS项目?

    我在 VS2015 中创建了简单的 SSRS 项目 我想通过创建构建定义和发布定义步骤来使用 VSTS 构建和部署 SSRS 项目 是否有任何第三方 VSTS 扩展可用 或者对于 SSRS 构建和 SSRS 部署与 SSIS 构建和 SSI
  • 子类化流

    我有兴趣创建自己的 Stream 子类 并且想知道应该重写哪些方法 部署在 pharo 和 Gemstone 上 我有一个包含各种类型事物的集合 我希望能够流式传输它的子集 其中包含类的元素 我不想复制集合或使用collect 块 因为集合
  • 在 CAB 中部署 C# ActiveX 以供 Internet Explorer 使用

    我正在拼命尝试部署一个用 C 开发的 IE 的 ActiveX 作为 CAB 存档 我阅读了很多资源 其中一些来自 StackOverflow 似乎很多人都遇到了同样的问题 我尝试了 3 种解决方案 a 创建 CAB VS 项目 b 使用手
  • SQL Server 2005:读提交事务隔离级别中的键范围锁?

    我正在帮助解决使用 SQL Server 2005 的 NET 应用程序中的一些死锁问题 我从下面的跟踪中获得了 XML 数据 真正让我困惑的是 RangeX X 锁定PK Exp Experience PriorFirm当事务隔离级别为读
  • Android 图像的 AES 加密/解密

    我需要找到一种在 Android 中加密 解密图像的方法 我是 Android 编程新手 从未在任何其他平台上加密 解密过 所以请给我一个很好的例子 因为我需要学习如何做到这一点 我正在开发一个需要加密 解密图像的项目 如果您能帮助我解决这
  • 如何在Excel中使用vba访问xml中的特定元素和属性?

    我正在努力让 Excel 解析 xml 文件 我找到了大量的示例 但似乎没有一个完全符合我的要求 而且我似乎无法克服错误 对象变量或未设置块变量 该 xml 格式良好 如下所示
  • 如何在绘图上绘制带注释的热图?

    我正在尝试制作一个带注释的热图 import plotly plotly as py import plotly tools as tls from plotly graph objs import import numpy as np i
  • PHP 单行语句中的 Netbeans 代码格式大括号

    Intro 我正在开发 PHPNetBeans IDE 7 2 Build 201207171143 我喜欢formatting以我的自定义格式清理我的代码 目前我与同事在一个小组中工作 我的一些同事习惯于编写不带大括号的单行语句 我认为这
  • 将 C 字符串转换为双精度数或从双精度数转换时出现奇怪的行为

    我无法理解 C 的规则 即在打印双精度数或将字符串转换为双精度数时应采用何种精度 下面的程序应该可以说明我的观点 include