为什么 C# 允许从 Long 到 Float 的“隐式”转换,而这可能会丢失精度?

2024-02-26

类似的问题长时间处于浮动状态,为什么? https://stackoverflow.com/questions/4352213/long-in-float-why这里没有回答我正在寻找的内容。

C# 标准允许从 long 到 float 的隐式转换。 但是任何大于 2^24 的 long 当表示为浮点时必然会失去其“值”。 C# 标准明确规定,long 到 float 的转换可能会失去“精度”,但永远不会失去“幅度”。

My Questions are
  1. 关于整数类型,“精度”和“幅度”的含义是什么。数字 n 是否与数字 n+1 完全不同,与实数不同,其中 3.333333 和 3.333329 可能被认为足够接近以进行计算(即取决于程序员想要的精度)
  2. 不允许从 long 到 float 的隐式转换会引发微妙的错误,因为它可能导致 long “默默地”失去价值(作为一名 C# 程序员,我习惯于编译器在防止此类问题方面做得非常出色)

那么 C# 语言设计团队允许这种隐式转换的理由是什么?我在这里缺少什么来证明从 long 到 float 的隐式转换是合理的?


这是一个很好的问题。实际上你可以概括这个问题,因为隐式转换也存在同样的问题:

  • int to float
  • uint to float
  • long to float (你问的是)
  • ulong to float
  • long to double
  • ulong to double.

实际上,所有积分类型(乃至char!!) 隐式转换为float and double;但是,只有上面列出的转换会导致精度损失。另一个值得注意的有趣的事情是,C# 语言规范在解释“为什么没有从十进制到双精度的隐式转换”时有一个自相矛盾的论点:

小数类型比浮点类型具有更高的精度,但范围更小。因此,从浮点类型到十进制的转换可能会产生溢出异常,从十进制到浮点类型的转换可能会导致精度损失。由于这些原因,浮点类型和十进制之间不存在隐式转换,并且如果没有显式转换,就不可能在同一表达式中混合浮点和十进制操作数。

我认为,“为什么做出这个决定”的问题最好由像埃里克·利珀特这样的人来回答。我最好的猜测......这是语言设计者没有任何强有力的论据支持一种或另一种方式的事情之一,所以他们选择了(他们认为的)更好的替代方案,尽管这是有争议的。在他们的辩护中,当你转换大量long to float,你确实失去了精度,但你仍然得到了最佳代表浮点世界中的那个数字。这与转换,比如说,int to byte可能存在溢出的地方(整数值可能超出了范围)byte可以代表),你会得到一个不相关/错误的数字。但在我看来,如果没有隐式转换,这会更加一致decimal到浮点,如果它们没有其他导致精度损失的转换。

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

为什么 C# 允许从 Long 到 Float 的“隐式”转换,而这可能会丢失精度? 的相关文章

  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • Confuser .NET 混淆器。安全吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我目前正在开发一个应用程序 其中阻止用户反编译代码非常重要 现在 我意识到 如果由经验丰富的程序员执行 大多数 exe 都是可反编译的
  • 使用 size_t 值反向遍历向量

    我想以相反的方向遍历向量的值 如您所知 向量的大小为 size t 当我使用以下代码时 for size t r m size 1 r gt 0 r x r f r for size t c r 1 c lt m size c x r m
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 实用程序库中应包含哪些内容[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 随着我的项目越来越多 我发现我经常从一个项目到另一个项目 从一个客户到另一个客户重复许多常见的任务 因此 我开始组装一个 实用程序 库 这是这些
  • ASP.NET MVC 路由 - 向路由添加 .html 扩展名

    我对 MVC 和路由非常陌生 我被要求修改一个应用程序以使用不同的 url 由于我没有经验 这项任务对我来说有点困难 好吧 让我们谈谈一些代码 routes MapRoute CategoryBySeName Route name prod
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 从 exit() 和 fork() 返回的结果奇怪地发生了位移

    我有一个 C 代码 有时会自行分叉 每个分叉都会执行一些操作 然后返回一个错误代码 目前 每个子进程返回其 ID 0 n void other int numero exit numero int main for int i 0 i lt
  • 为什么我不能对普通变量进行多态?

    我是一名Java程序员 最近开始学习C 我对某事感到困惑 据我了解 在 C 中 要实现多态行为 您必须使用指针或引用 例如 考虑一个类Shape与实施的方法getArea 它有几个子类 每个子类都以不同的方式重写 getArea 然后考虑以
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 未找到 _sqlite3_open 等符号错误

    您好 我收到此错误 Undefined symbols sqlite3 open referenced from main in ccRlWVer o sqliite3 close referenced from main in ccRlW
  • 为什么调试器只显示数组指针中的一个元素?

    首先 我知道new是执行此操作的 C 方法 我只是表明有不止一种方法可以重现此错误 而且两种方法都令人难以置信的令人沮丧 我有两种形式的源文件 我正在尝试调试另一个编程作业 但我并没有寻求帮助 基本上 我正在尝试重新实施set作为一个类 具
  • OpenGL 计算着色器调用

    我有一个与新计算着色器相关的问题 我目前正在研究粒子系统 我将所有粒子存储在着色器存储缓冲区中 以便在计算着色器中访问它们 然后我派遣一个一维工作组 define WORK GROUP SIZE 128 shaderManager gt u
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 如何在 Winform DataGridView 中创建不同的单元格格式

    我有一个 DataGridView 我将其绑定到 DataTable DataTable 是一个全数字值 要求 DataGridView 中的每 n 行都包含文本 而不是数值 以便在视觉上为用户分隔部分 我很高兴在绑定后将此文本数据放入 D
  • 获取会议组织者邮件地址 EWS API

    我想使用 EWS API 获取会议组织者的邮件地址 目前 我刚刚获得约会项目的一些属性 我听说你可以设置你想要获取哪些属性 我的代码看起来像这样 CalendarView cview new CalendarView start end c
  • 清理堆分配对象的良好实践或约定?

    我正在学习C 我有 C C ObjC 背景 相当高级的语言 在 C 或 ObjC 上 作为函数或方法的结果返回堆分配的对象是很简单的 因为对象的清理是受管理的 按照惯例 会在适当的时候销毁 但我不知道在 C 中应该如何处理这个问题 例如 s

随机推荐