c# - 浮动/双发行 x64/x86
问题描述
当涉及到 C# 中的 x64 和 x86 平台时,我在 Double/Float 上有一些奇怪的行为。
一个简单的测试在这里:
float testVar= 50;
double test = 1/ testVar* 1e6;
test == 19999.9995529652 for x64 and test == 20000 for x86
然而:
double test = 1 / 50f *1e6;
test == 19999.9995529652 for both platforms
我知道,用 double 计算 float 并不是一种好的风格,而且我知道,double 和 float 并不精确,但真正让我感到震惊的是 x64 和 x86 仅在之前分配了 float testVar 时表现不同。
有谁知道为什么?
解决方案
我猜编译器将 (testVar * 1e6) 评估为浮点操作,因为至少有一个浮点操作数。然后,除以 1 / float 得到一个保存到变量中的双精度结果。
在第二种情况下,因为没有浮点操作数,所以从头到尾所有内容都被评估为双精度。因此在 x86 的第一种情况下精度损失。
推荐阅读
- python - 加载具有字符串格式的文件
- ios - 如何防止两个堆叠的 UIView 的阴影加倍并变厚?[迅速]
- laravel - 无法在 Plesk 中使用 Laravel 发送电子邮件
- sorting - 得到一个错误,即使我是一个数字,我也无法将 nil 与数字进行比较
- linux - 尝试使用用户输入、环境变量、文件系统操作、条件、下载、取消归档来编写脚本
- http - Dart:未处理的异常:类型'String'不是'index'类型'int'的子类型
- rest - 使用 Genexus 的 Rest Service 问题(url 编码)
- reactjs - 与 Firestore 的实时反应聊天,我如何订阅数据?
- ruby-on-rails - 如何在没有用户会话的情况下连接 websocket?
- python - 自动更改谷歌搜索页面