C浮点精度[重复]

2024-04-17

可能的重复:
浮点比较 https://stackoverflow.com/questions/7011184/floating-point-comparison

我对 C/C++ 中浮点数的准确性有疑问。当我执行下面的程序时:

#include <stdio.h>

int main (void) {
    float a = 101.1;
    double b = 101.1;
    printf ("a: %f\n", a);
    printf ("b: %lf\n", b);
    return 0;
}

Result:

a: 101.099998
b: 101.100000

我相信 float 应该有 32 位,所以应该足以存储 101.1 为什么?


You can only represent numbers exactly in IEEE754 (at least for the single and double precision binary formats) if they can be constructed from adding together inverted powers of two (i.e., 2-n like 1, 1/2, 1/4, 1/65536 and so on) subject to the number of bits available for precision.

在浮点数(23 位精度)提供的缩放范围内,没有任何 2 的倒幂组合可以精确地达到 101.1or双精度(52 位精度)。

如果您想了解有关二次幂反转的工作原理的快速教程,请参阅这个答案 https://stackoverflow.com/questions/3448777/how-to-represent-0-1-in-floating-point-arithmetic-and-decimal/3448855#3448855.

将该答案中的知识应用到您的101.1数字(作为单精度浮点数):

s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm    1/n
0 10000101 10010100011001100110011
           |  | |   ||  ||  ||  |+- 8388608
           |  | |   ||  ||  ||  +-- 4194304
           |  | |   ||  ||  |+-----  524288
           |  | |   ||  ||  +------  262144
           |  | |   ||  |+---------   32768
           |  | |   ||  +----------   16384
           |  | |   |+-------------    2048
           |  | |   +--------------    1024
           |  | +------------------      64
           |  +--------------------      16
           +-----------------------       2

尾数部分实际上永远持续下去101.1:

mmmmmmmmm mmmm mmmm mmmm mm
100101000 1100 1100 1100 11|00 1100 (and so on).

因此,这不是精度问题,没有多少有限位可以准确地以 IEEE754 格式表示该数字。

Using the bits to calculate the actual number (closest approximation), the sign is positive. The exponent is 128+4+1 = 133 - 127 bias = 6, so the multiplier is 26 or 64.

The mantissa consists of 1 (the implicit base) plus (for all those bits with each being worth 1/(2n) as n starts at 1 and increases to the right), {1/2, 1/16, 1/64, 1/1024, 1/2048, 1/16384, 1/32768, 1/262144, 1/524288, 1/4194304, 1/8388608}.

当你把所有这些加起来时,你会得到1.57968747615814208984375.

当您将其乘以之前计算的乘数时,64, 你得到101.09999847412109375.

所有数字的计算方法为bc使用 100 位十进制数字的比例,导致大量尾随零,因此数字should非常准确。更是如此,因为我用以下方法检查了结果:

#include <stdio.h>
int main (void) {
    float f = 101.1f;
    printf ("%.50f\n", f);
    return 0;
}

which also给我101.09999847412109375000....

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

C浮点精度[重复] 的相关文章

随机推荐

  • 如何修复 VS Code 中的错误文件描述符错误?

    我有 vsc 版本 1 63 2 我收到以下通知 文件更改观察程序意外停止 重新加载窗口可能会再次启用观察程序 除非无法监视工作区的文件更改 在 窗口 日志 使用命令面板中的 开发人员 打开日志文件 命令打开 中 出现错误 renderer
  • 使用 R 中的传单库绘制跨越国际日期变更线的路线

    我有兴趣使用 R 的传单库绘制从滑铁卢到台湾的路线 路线的坐标是使用 geosphere 中的 gcIntermediate 函数获得的 然而 该路线涉及穿越国际日期变更线 因此该路线在地图边缘被切断 并在顶部与直线连接 我得到的情节 错误
  • JUnit 5 何时提供场景测试?

    在一次会议 JavaForum Stuttgart 2016 上 他们表示 JUnit 5 将包含一个支持场景测试的功能 http 2016 java forum stuttgart de de Abstracts Slot 1 html
  • Keras LSTM 输入形状的输入形状错误

    在 Keras 中使用时间序列时出现此错误 ValueError Error when checking input expected lstm 1 input to have 3 dimensions but got array with
  • Swift 中基于内容的动态 UITextView 大小

    我不认为有人可以指导我在仍然使用自动布局的同时动态调整 UITextView 大小的正确方法 使用 Swift 就是这样 我尝试以编程方式调整底部约束 试图让 UITextView 拥抱内容 但我不知道如何获取 UITextView 内容的
  • TinyMCE 在 DOM 中渲染后执行操作

    我正在使用 TinyMCE 4 并按如下方式设置 tinyMCE init mode specific textareas editor selector basicTinyMCE theme modern readonly false 我
  • 长度为 5 的回文数

    给定一个二进制字符串 S 找到长度为 5 的回文子序列的数量 长度为 5 的回文子序列是数组 a 我的想法 我想出了如下的递归 palin s palin s 1 palin s 1 palin s 1 1 当 s 0 s 1 时 就是上面
  • Tomcat:绕过指定 IP 地址的基本身份验证

    我已经配置 tomcat 进行基本身份验证 我不希望任何人访问我的 Web 应用程序 但该应用程序正在提供 Web 服务 所以我想从基本身份验证中绕过特定的IP地址 该IP不应该需要身份验证 tomcat users xml
  • Tomcat 8.5.29 HTTP/2 不支持 GZIP 压缩

    我正在使用 Tomcat 8 5 29 并使用相应的配置 我已为该站点启用了 HTTP2 支持 以下是 server xml 文件中的配置
  • set_index 不在 pandas 中建立索引

    对于下面的简单程序 我期望第二个输出与第一个输出相同 为什么这没有发生 这只是订单的改变data1 and data2 columnList PID Sec Util random data1 67123 12 85 100 67123 1
  • 以编程方式关闭 USB 端口的电源

    我正在开发一个项目 我想使用这些 http www woot com blog post usb powered woot off lights 2 http www woot com blog post usb powered woot
  • git 克隆失败并显示“ssh_dispatch_run_fatal”

    我已经配置了ssh密钥 但仍然无法成功git克隆 错误信息是 git clone email protected cdn cgi l email protection alimail frontend ragusa git Cloning
  • 使用 VBA 实现简单的替换密码

    我正在尝试编写一个程序来更改字符串中的字母 但我一直遇到一个明显的问题 即如果它更改了值 例如将 A 更改为 M 当它更改为 M 时 它会将 M 更改为其他值 因此 当我运行代码将其全部更改回来时 它会将其转换为好像该字母最初是 M 而不是
  • CommandError:使用 Flask-Migrate 迁移时无法找到由“...”标识的修订版本

    我今天开始使用 Flask Migrate 并将其安装在一个测试项目上 但是我收到以下错误 alembic util exc CommandError 无法找到由 e39d16e62810 重现步骤 运行 python create db
  • 如何避免子文件夹上的 svn:mergeinfos ?

    我们尝试仅将 svn mergeinfo 属性保留在根分支文件夹上 然而 我们不断看到它渗入子文件夹中 我们已经能够确定一些可能的原因 在存储库浏览器中移动文件夹 在 IntelliJ 中移动和 或重命名包 使用旧的 svn 客户端 任何人
  • 在azure devOps中,如何在项目中复制仪表板

    我在项目中创建了一个仪表板 并插入小部件来显示团队进度 目前 仪表板中有 2 个团队 每个团队有 8 个小部件 我想将它们分开 以便每个团队都有自己的个人仪表板 因为我不想真正从头开始制作它 所以我想复制它 然后删除其他团队在每个新的个人仪
  • FASM 是否使用 Intel 语法?

    我尝试在 FASM 中编译以下代码 mov DWORD PTR ebp 4 1234567 它给了我一个 无效表达式 错误 但是以下代码有效 mov DWORD ebp 4 1234567 那么 FASM 是否使用 Intel 语法 我假设
  • 如何使用 OOP 运行存储在容器中的实际对象的函数?

    如何使用 OOP 运行存储在容器中的实际对象的函数 背景 我正在编写一个游戏 有 4 间相连的房间 有两种不同的房间类型和两种不同的玩家类型 玩家应该作为线程运行 杀手应该在行动室中与普通玩家进行战斗 在第二种类型的房间里 不应该发生任何事
  • VBScript 条件短路解决方法

    我有一个必须维护的大型经典 ASP 应用程序 并且我多次发现自己因缺乏短路评估能力而受挫 例如 VBScript 不会让你逃脱 if not isNull Rs myField and Rs myField lt gt 0 then 因为如
  • C浮点精度[重复]

    这个问题在这里已经有答案了 可能的重复 浮点比较 https stackoverflow com questions 7011184 floating point comparison 我对 C C 中浮点数的准确性有疑问 当我执行下面的程