c中的double和float可以存储多大的数字?

2024-04-16

我试图弄清楚我可以使用多大的数字作为浮点数double。但除了整数值之外,它并没有按照我预期的方式存储。double应该保存 8 个字节的信息,足以保存变量 a,但它保存得不正确。表明1234567890123456768其中最后 2 位数字不同。当我存储时214783648或 float 变量最后一位的任意数字b,它显示相同的值214783648。这应该是极限。发生什么了?

double a;
float b;
int c;
a = 1234567890123456789;
b = 2147483648;
c = 2147483647;
printf("Bytes of double: %d\n", sizeof(double));
printf("Bytes of integer: %d\n", sizeof(int));
printf("Bytes of float: %d\n", sizeof(float));

printf("\n");

printf("You can count up to %.0f in 4 bytes\n", pow(2,32));
printf("You can count up to %.0f with + or - sign in 4 bytes\n", pow(2,31));
printf("You can count up to %.0f in 4 bytes\n", pow(2,64));
printf("You can count up to %.0f with + or - sign in in 8 bytes\n", pow(2,63));

printf("\n");

printf("double number: %.0f\n", a);
printf("floating point: %.0f\n", b);
printf("integer: %d\n", c);

return 0;

可以存储在浮点类型中的最大(有限)数这个问题的答案是FLT_MAX or DBL_MAX for float and double, 分别。

然而,这并不意味着该类型可以精确地表示每个较小的数字或整数(事实上,甚至不接近)。

First you need to understand that not all bits of a floating point number are “equal”. A floating point number has an exponent (8 bits in IEEE-754 standard float, 11 bits in double), and a mantissa (23 and 52 bits in float, and double respectively). The number is obtained by multiplying the mantissa (which has an implied leading 1-bit and binary point) by 2exponent (after normalizing the exponent; its binary value is not used directly). There is also a separate sign bit, so the following applies to negative numbers as well.

随着指数的变化,尾数的连续值之间的距离也会变化,即指数越大,相隔越远浮点数的连续可表示值是。因此,您可以精确地存储给定大小的一个数字,但不能存储“下一个”数字。人们还应该记住,一些看似简单的分数无法用任意数量的二进制数字精确表示(例如,1/10,十分之一,是一个无限重复的二进制序列,就像1/3,三分之一,以十进制表示)。

When it comes to integers, you can precisely represent every integer up to 2mantissa_bits + 1 magnitude. Thus an IEEE-754 float can represent all integers up to 224 and a double up to 253 (in the last half of these ranges the consecutive floating point values are exactly one integer apart, since the entire mantissa is used for the integer part only). There are individual larger integers that can be represented, but they are spaced more than one integer apart, i.e., you can represent some integers greater than 2mantissa_bits + 1 but every integer only up to that magnitude.

例如:

float f = powf(2.0f, 24.0f);
float f1 = f + 1.0f, f2 = f1 + 2.0f;
double d = pow(2.0, 53.0);
double d1 = d + 1.0, d2 = d + 2.0;
(void) printf("2**24 float = %.0f, +1 = %.0f, +2 = %.0f\n", f, f1, f2);
(void) printf("2**53 double = %.0f, +1 = %.0f, +2 = %.0f\n", d, d1, d2);

Outputs:

2**24 float = 16777216, +1 = 16777216, +2 = 16777218
2**53 double = 9007199254740992, +1 = 9007199254740992, +2 = 9007199254740994

As you can see, adding 1 to 2mantissa_bits + 1 makes no difference since the result is not representable, but adding 2 does produce the correct answer (as it happens, at this magnitude the representable numbers are two integers apart since the multiplier has doubled).

 

TL;DR An IEE-754 float can precisely represent all integers up to 224 and double up to 253, but only some integers of greater magnitude (the spacing of representable values depends on the magnitude).

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

c中的double和float可以存储多大的数字? 的相关文章

  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • 如何调整 Windows 窗体以适应任何屏幕分辨率?

    我知道这是重复的问题 但我检查了所有其他相关问题 他们的答案没有帮助 结果仍然与屏幕截图 2 中所示相同 我是 C Windows 窗体新手 如截图1所示 我有Form1有一些控件 每组控件都放在一个面板中 我在 PC1 中设计了应用程序
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • MSMQ接收和删除

    是否有任何选项可以在读取消息后将其从 MSMQ 中删除 比如 接收 删除可以作为原子操作运行吗 听起来您想查看下一条消息 然后在处理完成后接收它 Message message Queue Peek Queue ReceiveById me
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 选择 asp.net CheckBoxList 中的所有项目

    ASP NET 和 C 我想要一个带有 全选 项目的复选框列表 当这个特定项目是 已选择 所有其他都将被选择 也 当选择被删除时 这个项目 也将来自所有人 其他物品 选中 取消选中 任何其他项目只会有一个 对特定项目的影响 无论选择状态如何
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel

随机推荐

  • jQuery validate:如何添加正则表达式验证规则?

    我正在使用jQuery http en wikipedia org wiki JQuery验证插件 好东西 我想迁移现有的 ASP NET 解决方案以使用 jQuery 而不是 ASP NET 验证器 我缺少替代品正则表达式验证器 我希望能
  • Unity3d NavMeshAgent.isOnNavMesh 在特定功能中变为 false

    我更改了标题以反映添加的澄清信息 我正在遵循 Unity 教程 1 当需要测试播放器单击控件时 Unity 给出了一个错误 SetDestination 只能在已放置在导航网格上的活动代理上调用 据我所知 我的代理处于活动状态并且位于 na
  • Android IPC远程服务调用显示错误

    我想做一个关于IPC通信 服务之间的通信 的演示应用程序 我在用AIDL为了那个原因 我发现大部分教程RemoteService和客户端在同一个包中 我实际上是分开做的 同时传递我正在使用的对象Parcelable方法和面临的错误 它说就像
  • C++ 中函数原型和函数实现有什么区别?

    我应该将我的实现放在一个文件中 将原型放在头文件中 但按照我的理解 充满原型的头文件不会很有用 这些是什么东西 其中之一与定义或声明相同吗 函数原型是声明其参数类型的函数声明 这种区别是历史性的 在 C 中 可以声明没有原型的函数 但在 C
  • 如何获取 Kubernetes POD 的活动连接数

    我是 Kubernetes 新手 对于我们的应用程序 我需要找到 pod 的活动连接数 我分析了一下 发现我们可以使用 Istio 等 Kubernetes 插件来获取此类数据 但我了解到 使用此类插件可能会导致内存命中 因为插件为每个 P
  • Python Flask Cors 问题

    我对 Python 有点陌生 但在使用 Node 应用程序时遇到了同样的问题 我正在向本地 Python 服务器发出一个非常标准的 jQuery AJAX 请求 init function callback var token config
  • 非交互式“git flow release finish”

    我如何使用git flow release finish以不要求合并提交消息的方式 这 m正如我所料 flag 没有提供此功能 当然 目标是能够以不需要交互的方式编写脚本 可以设置环境变量 export GIT MERGE AUTOEDIT
  • Maven-resources-plugin不会复制.metadata文件夹

    我正在尝试使用 maven resources plugin 复制文件夹或以下结构 root metadata Project gitignore 项目目录和 gitignore 文件被复制 但 metadata 目录由于某种原因被遗漏 如
  • Go:使用 gdb 打印变量

    在此程序中 如何使用调试器中断执行并打印 i 的值 package main import fmt func main x abc i 3 fmt Println i fmt Println x 我无法打印我 不过我可以打印 x go bu
  • 将工具栏设置为片段中的操作栏

    我想将我的工具栏设置为操作栏 但由于您的工具栏是布局元素 因此它必须位于您的布局中 现在我的布局在我的片段中 我在布局中添加了工具栏 并在片段中调用它 Toolbar Toolbar toolbar Toolbar getActivity
  • 如何有条件地要求 Angular 4 中的表单输入?

    我正在使用模板驱动的表单来添加任务 并且有 2 个数字类型的输入字段用于估计完成任务的分钟数 一个字段用于估计小时数和 另一个是完成任务的估计分钟数 因为任务估计可以在几小时内完成 例如1hrs 或者像这样的小时和分钟1小时30分钟 所以我
  • PHP7 - nusoap - nusoap_client 有一个已弃用的构造函数

    我想用nusoap on Laravel 5 3 with PHP7 但是当我生病时尝试安装它composer从该包中 https github com codecasts nusoap php7 https github com code
  • unique_together 中的多个元组

    当我定义模型并在元中使用 unique together 时 我可以定义多个元组 这些是进行 OR 运算还是 AND 运算 可以说我有一个模型 class MyModel models Model druggie ForeignKey dr
  • 给定一个字符串数组,返回所有属于字谜词组的字符串

    给定一个字符串数组 返回所有属于字谜词的字符串组 我的解决方案 对于数组中的每个字符串单词 对其进行排序 O m lg m m 是单词的平均长度 建立一个哈希表 将排序后的单词作为键放入哈希表中 并生成该单词的所有排列 O m 如果字典中存
  • 用于验证 Google Analytics UA 编号的正则表达式

    我并不是 100 清楚 Google Analytics UA 编号始终是 6 位数字 一个破折号和 2 位数字 正如 Google 在其文档中经常提到的那样 常见的反例是帐户部分使用少于 6 个 配置文件使用少于 1 4 个 所有示例都始
  • WCAG:应用样式时,Firefox 和 Edge 不会在焦点输入元素上显示轮廓

    我正在创建一个表单 它遵循一些 WCAG 准则 其中之一是 G165 使用平台的默认焦点指示器 以便继承高可见度的默认焦点指示器 https www w3 org TR 2016 NOTE WCAG20 TECHS 20161007 G16
  • 不同日志文件中不同级别的日志

    我们如何编写一个简单的 log4j2 xml 文件 将不同级别的日志放入不同的文件中 例如 我们有错误日志和任何信息日志 我需要将所有错误日志消息推送到一个日志文件中 并将所有信息日志消息推送到另一个文件中 我希望 InfoControll
  • 在 Eval 中设置变量 (JavaScript)

    我正在编写一个 GreaseMonkey 脚本 使用 JQuery 并且我需要一些由原始页面中的脚本设置的变量 如下所示 我从另一个页面获取这个元素并尝试评估它 奇怪的是这不起作用 get link url null function da
  • golang中的[]string和...string有什么区别?

    在 Go 语言中 string是一个字符串数组 我们还使用 string作为参数 有什么不同 函数定义 func f args string 我可以像下面这样调用这个函数吗 args string a b f args string是一个字
  • c中的double和float可以存储多大的数字?

    我试图弄清楚我可以使用多大的数字作为浮点数double 但除了整数值之外 它并没有按照我预期的方式存储 double应该保存 8 个字节的信息 足以保存变量 a 但它保存得不正确 表明1234567890123456768其中最后 2 位数