为什么从 int 到 float 的转换会对值进行四舍五入?

2023-11-22

我正在阅读 CS:APP,关于演员阵容,它说在演员阵容时从int到float,数字不能溢出,但可能会被四舍五入。

这对我来说很奇怪,因为我不知道要舍入什么,所以我尝试了一下。我认为这只适用于非常大的整数(接近INT_MAX/INT_MIN),但四舍五入也会发生在一亿左右的值。 (不确定这首先发生在哪里)。

为什么会出现这种情况?范围为float远远超过int。有人可能会说浮点数不能精确表示,但是当从intto double价值没有变化。优点doubleover float是它具有更大的范围和精度。但float仍然有足够的范围来“封装”整数,并且精度并不重要,因为整数没有小数位(好吧,全是 0),还是我想错了?

这是我得到的一些输出(这是代码:http://pastebin.com/K3E3A6Ni):

FLT_MAX = 340282346638528859811704183484516925440.000000  
INT_MAX     = 2147483647  
(float)INT_MAX = 2147483648.000000  
(double)INT_MAX = 2147483647.000000  
INT_MIN     = -2147483648  
(float)INT_MIN = -2147483648.000000  

====other values close to INT_MIN INT_MAX====  
INT_MAX-1     = 2147483646  
(float)INT_MAX-1 = 2147483648.000000  
INT_MIN+1     = -2147483647  
(float)INT_MIN+1 = -2147483648.000000  
INT_MAX-2      = 2147483645  
(float)INT_MAX-2  = 2147483648.000000  
INT_MAX-10     = 2147483637  
(float)INT_MAX-10 = 2147483648.000000  
INT_MAX-100         = 2147483547  
(float)INT_MAX-100  = 2147483520.000000  
INT_MAX-1000         = 2147482647  
(float)INT_MAX-1000 = 2147482624.000000  

(float)1.234.567.809 = 1234567808.000000  
(float)1.234.567.800 = 1234567808.000000  
(float)1.000.000.005 = 1000000000.000000  
(float)800.000.003   = 800000000.000000  
(float)500.000.007   = 500000000.000000  
(float)100.000.009   = 100000008.000000  

我假设通过float你的意思是一个 32 位 IEEE-754 二进制浮点值,通过double您的意思是 64 位 IEEE-754 二进制浮点值,并且int你的意思是一个32位整数。

为什么会出现这种情况? float的范围远远超过int

是的,但是精确 of float只有 7-9 位小数。更具体地说,有效数只有 24 位宽……所以如果您尝试在其中存储 32 位信息,就会遇到问题。

但是当从int to double价值没有变化

当然,因为一个double有一个 53 位有效数 - 这里有足够的空间容纳 32 位整数!

换个角度想,连续之间的差距int值始终为 1...而连续值之间的差距float值开始时非常非常小...但随着值大小的增加而增加。在达到极限之前它就已经达到“超过 2”int...所以你到达了一个阶段,不是每个int可以准确表示。

To think of it another way, you can simply use the pigeon-hole principle... even ignoring NaN values, there can be at most 232 float values, and at least one of those is not the exact value of an int - take 0.5, for example. There are 232 int values, therefore at least one int value doesn't have an exact float representation.

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

为什么从 int 到 float 的转换会对值进行四舍五入? 的相关文章

  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • EF Core 返回 null 关系,直到直接访问

    我有一些如下所示的模型 public class Mutant public long Id get set Relations public long OriginalCodeId get set public virtual Origi
  • 与 MinGW 的静态和动态/共享链接

    我想从一个简单的链接用法开始来解释我的问题 假设有一个图书馆z它可以编译为共享库 libz dll D libs z shared libz dll 或静态库 libz a D libs z static libz a 让我想要链接它 然后
  • 如何使用不同的基本路径托管 Blazor WebAssembly 应用程序

    我有一个 Blazor Webassemble NET 托管应用程序 在我们托管它的服务器上 应用程序的基本路径将是mydomain com coolapp 因此 为了尝试让应用程序在服务器上正确呈现 我一直遵循本页 应用程序基本路径 部分
  • 非模板函数中的尾随返回类型[重复]

    这个问题在这里已经有答案了 我见过有人使用以下语法来实现函数 auto get next gt int 代替 int get next 我理解两者 并且我知道尾随返回类型语法对于使用 decltype 的模板代码很有用 就我个人而言 我会避
  • C++中类成员函数相互调用有什么好处?

    我是 C 新手 我发现下面的编程风格对我来说很有趣 我在这里写了一个简化版本 include
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • 获取列表框中视图中的项目

    我有一个 ListBox 其属性 VirtualizingStackPanel VirtualizationMode 设置为 回收 我正在绑定一个自定义集合 实现IList and IList
  • Windows Phone 7 - ScrollViewer 值已更改

    我一直在寻找解决方案 但无法找到正确的解决方案 我的网格宽度为 960 并且有ScrollViewer在里面 现在我想知道滚动时滚动的值 水平偏移 我找到的所有解决方案都是针对 wpf silverlight 的 它对我不起作用 Edit
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 从图像创建半透明光标

    是否可以从图像创建光标并使其半透明 我目前正在拍摄自定义图像并覆盖鼠标光标图像 如果我可以将其设为半透明 那就太好了 但不是必需的 销售人员喜欢闪亮的 目前正在做这样的事情 Image cursorImage customImage Get
  • 更改私有模块片段是否会导致模块重新编译?

    On 此页面有关 C 20 模块功能 https www modernescpp com index php c 20 modules private module fragment and header units 我发现了这样的说法 借
  • 在一个解决方案中调用不同项目的方法

    1 个解决方案中有 3 个项目 我对第一个项目中的主文件进行的主要操作 但是我需要调用第三个项目中的方法并使用类 例如 第三个项目有 public DataClasses1DataContext base global WindowsFor
  • c++ - <未解析的重载函数类型>

    在我的班级里叫Mat 我想要一个将另一个函数作为参数的函数 现在我有下面 4 个函数 但是在调用 print 时出现错误 第二行给了我一个错误 但我不明白为什么 因为第一行有效 唯一的区别是功能f不是班级成员Mat but f2是 失败的是
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 使用通用存储库模式和流畅的 nHibernate

    我目前正在开发一个中型应用程序 它将访问不同站点上的 2 个或更多 SQL 数据库等 我正在考虑使用类似的东西 http mikehadlow blogspot com 2008 03 using irepository pattern w
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • 如何使用 Microsoft Graph API 更新 MailboxSettings

    我想从不同的日历更新邮箱设置 如何构建可以通过 Microsoft Graph 更新 MailboxSetting 的请求 这是我的代码示例 但有例外 代码示例 User obj GraphServiceClient Users roomC

随机推荐

  • 为什么 gitlab-runner 无法克隆我的项目? (主机名错误,连接失败)

    我设置了 Gitlab 服务器并需要使用 gitlab runner exe 运行测试 Windows gitlab runner 的执行器设置为shell the config toml好像 concurrent 1 check inte
  • 如何捕获 JNI/Java 异常?

    我的应用程序中有一个 JNI 层 在某些情况下 Java 会引发异常 如何获取JNI层的Java异常 我的代码如下 if pConnDA gt penv gt ExceptionCheck pConnDA gt penv pConnDA g
  • C++ 任意长度整数

    在C 中 是否可以定义任意长度的整数 所以不必使用uint64 t对于 33 到 64 位之间的任何内容 我可以定义自己的 34 位 36 位等整数 正如您提到的 编译器有自己的类型 long 大多数平台上为 32 位 和 long lon
  • Clr 命名空间映射到默认 xaml 命名空间

    我有点厌倦了必须在每个 xaml 文件中声明 xmlns 以及必须为自定义控件使用前缀 是否可以将 clr 命名空间映射到 http schemas microsoft com winfx 2006 xaml presentation 我在
  • 如何为 Eclipse 和 M2E 的 maven pom.xml 文件中的类路径条目定义访问规则?

    为了避免 jfxrt jar 的非法访问警告 我手动更改了类路径文件以包含访问规则 想要类路径条目
  • 如何用flutter检查输入的电话号码是否有效?

    我正在尝试检查输入的电话号码是否有效 意思是 如果我输入了世界上不存在的错误数字 那么它会向我显示一个内容为 请输入有效数字 的祝酒词 Expanded child TextField keyboardType TextInputType
  • 读取带有分隔符的文件

    如何从文件中读取行并将该行的特定段分配给结构中的信息 如何在空白行处停止 然后再次继续 直到到达文件末尾 背景 我正在构建一个程序 它将获取输入文件 读入信息 并使用双重哈希将该信息放入哈希表的正确索引中 假设我有结构 struct Dat
  • Gradle 为每个资源文件夹构建

    是否可以配置 Gradle 来构建几个 Android apk 文件 其中每个文件仅使用一个资源类型文件夹 I mean 构建 hdpi apk 构建 mdpi apk 构建 xhdpi apk 我知道我可以在构建之前简单地删除某些文件夹
  • GUI 的自动化测试 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 这个问题与单元测试无关 它适用于桌面产品 这是关于 GUI 的测试以及测试是否在正确的时间在正确的文本框中输入了正确的内容 我曾经工作过的一家公司使用过WinRunner 不同的部门 所以
  • 在 C++ 中创建矩阵的正确方法

    我想为图创建一个邻接矩阵 因为我读过 使用以下形式的数组是不安全的matrix x y 因为它们不检查范围 所以我决定使用 stl 的向量模板类 我需要在矩阵中存储的只是布尔值 所以我的问题是 如果使用std vector
  • Jenkins REST buildWithParameters 覆盖默认参数值的 JSON 格式是什么

    我可以通过发送 POST 调用来使用其参数的默认值构建 Jenkins 作业http jenkins 8080 view Orion phase 2 job test remote api triggerring buildWithPara
  • Django Rest 框架不断返回嵌套关系错误

    盯着我的代码很长一段时间 我一直遇到同样的错误 有趣的是 我为模型的另一部分制作了一组类似的序列化器 并且它们工作得很好 这是我不断收到的错误 onderhoudapi conditiedeel json 处的 AttributeError
  • 在 VSTS 中运行 xunit.net 测试

    我运行时遇到问题xunit net测试在VSTS 运行构建计划时 Test assemblies步骤产生以下日志 2017 03 21T12 11 39 3302859Z section 开始 测试组件2017 03 21T12 11 39
  • 如何使用 lucene.net 实现多个过滤器的搜索

    我是 lucene net 的新手 我想在客户端数据库上实现搜索功能 我有以下场景 用户将根据当前选择的城市搜索客户 如果用户想要搜索其他城市的客户 则必须更换城市并重新进行搜索 为了细化搜索结果 我们需要提供针对区域 多个 Pincode
  • 滚动时检测 RecyclerView 何时到达最底部位置

    我有 RecyclerView 的代码 recyclerView RecyclerView rootview findViewById R id fabric recyclerView recyclerView setLayoutManag
  • Eclipse 项目中缺少 Maven 依赖项

    我们用maven建立了一个项目来解决依赖关系 它通常工作正常 但现在我尝试在新 PC 上编译并运行它 但我遇到了 Eclipse 中缺少依赖项的问题 有趣的是 如果我在控制台或 Eclipse 中运行 mvn package 它工作正常 甚
  • 具有 API 的开源论坛

    有人对基于 PHP Python 或 J2EE 的网络论坛有什么建议吗 该论坛具有良好的 API 可以通过编程方式创建用户和论坛主题 phpBB第一个想到的就是开源 因为它是免费的 实际上 几乎所有论坛平台都有某种 api 您可以通过编程方
  • APC 与 PHP 5.4 或 PHP 5.5 兼容吗?

    APC 似乎没有更新以与 php 5 4 版本一致 我希望他们像最初计划的那样将 APC 包含在 PHP 核心中 对于当前 APC 是否适用于 php 5 4 我似乎找不到任何明确的答案 我设法找到 php 5 4 的 Ubuntu 软件包
  • 如何将 Angular JS 集成到 Grails 2.3.4 中?

    我正在运行grails 2 3 4并考虑将 angularjs 集成到我的下一个应用程序中 我认为从服务器端来说最好的方法是使用grailsREST域和控制器类中的集成 然而我被困在这里了 如何让 grails 与 angularjs 进行
  • 为什么从 int 到 float 的转换会对值进行四舍五入?

    我正在阅读 CS APP 关于演员阵容 它说在演员阵容时从int到float 数字不能溢出 但可能会被四舍五入 这对我来说很奇怪 因为我不知道要舍入什么 所以我尝试了一下 我认为这只适用于非常大的整数 接近INT MAX INT MIN 但