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浮点精度[重复] 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 如何修复 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 中浮点数的准确性有疑问 当我执行下面的程