为什么从 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 的转换会对值进行四舍五入? 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 为什么 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 但