- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当您阅读 MSDN on System.Single
:
Single
complies with the IEC 60559:1989 (IEEE 754) standard for binary floating-point arithmetic.
The
float
anddouble
types are represented using the 32-bit single-precision and 64-bit double-precision IEEE 754 formats [...]
The product is computed according to the rules of IEEE 754 arithmetic.
float
类型及其乘法符合 IEEE 754。
float
实例,存在一个且只有一个
float
这是他们的“正确”产品。不允许产品依赖于计算它的系统的某些“状态”或“设置”。
using System;
static class Program
{
static void Main()
{
Console.WriteLine("Environment");
Console.WriteLine(Environment.Is64BitOperatingSystem);
Console.WriteLine(Environment.Is64BitProcess);
bool isDebug = false;
#if DEBUG
isDebug = true;
#endif
Console.WriteLine(isDebug);
Console.WriteLine();
float a, b, product, whole;
Console.WriteLine("case .58");
a = 0.58f;
b = 100f;
product = a * b;
whole = 58f;
Console.WriteLine(whole == product);
Console.WriteLine((a * b) == product);
Console.WriteLine((float)(a * b) == product);
Console.WriteLine((int)(a * b));
}
}
float
s(即
a
和
b
)及其产品。最后四个写行是有趣的。这是在使用
编译后在 64 位机器上运行的输出调试 x86 (左),
发布 x86 (中)和
x64 (对):
float
的结果操作取决于构建配置。
"case .58"
之后的第一行是对两个
float
相等的简单检查s。我们希望它独立于构建模式,但事实并非如此。我们希望接下来的两行是相同的,因为它不会改变任何内容来转换
float
到
float
.但他们不是。我们也希望他们阅读
"True↩ True"
因为我们正在比较产品
a*b
给自己。我们期望输出的最后一行独立于构建配置,但事实并非如此。
0.58
的二进制表示(
a
) 是:
0 . 1(001 0100 0111 1010 1110 0)(001 0100 0111 1010 1110 0)...
0 . 1(001 0100 0111 1010 1110 0)(001 (*)
Single
.现在,数字“一百”(
b
)是:
110 0100 . (**)
(*)
和
(**)
给出:
11 1001 . 1111 1111 1111 1111 1110 0100
11 1010 . 0000 0000 0000 0000 00
1
,不是
0
(四舍五入到最近)。所以我们得出结论是
58f
根据 IEEE。这绝不是先验的,例如
0.59f * 100f
小于
59f
, 和
0.60f * 100f
大于
60f
,根据 IEEE。
float
以额外的精度进行乘法,然后“忘记”再次摆脱该精度? float
表达式到类型 float
改变什么? (a*b)
到临时局部变量,改变行为,当它们应该在数学上(根据 IEEE)等效时?程序员如何提前知道运行时是否选择持有float
是否具有“人工”额外(64 位)精度? 最佳答案
我没有检查过你的算术,但我以前肯定见过类似的结果。除了 Debug模式有所作为之外,分配给局部变量与实例变量也可以有所不同。根据 C# 4 规范的第 4.1.6 节,这是合法的:
Floating point operations may be performed with higher precision than the result type of the operation. For example, some hardware architectures support an "extended" or "long double" floating point type with greater range and precision than the
double
type, and implicitly perform all floating point operations using this higher precision type. Only at excessive cost in performance can such hardware architectures be made to perform floating point operations with less precision. Rather than require an implementation to forfeit performance and precision, C# allows a higher precision type to be used for all floating point operations. Other than delivering more precise results, this rarely has any measurable effects. [...]
关于c# - 在 64 位机器上运行 x86 编译代码时,单精度算术被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12644591/
我知道存储单个值(或 double 值)不可能非常精确。因此,例如存储 125.12 可能会得到 125.1200074788。现在在delphi中,它们是一些有用的函数,例如samevalue或co
假设 N 是根据 IEEE754 单精度标准表示的任意数字。我想在 IEEE754 中再次找到 N/2 的最精确可能表示。 我想找到一个通用算法(用文字描述,我只想考虑必要的步骤和情况)来获得表示。
我将许多经度和纬度存储为 doubles,我想知道我是否可以将它们存储为 floats。 要回答这个问题,我需要知道 single precision floating point number 的近
我需要以一种不会丢失任何信息的方式将单精度数字表示为文本(这样我就可以得到相同的数字,可能会忽略 NaN 等),但没有太多的伪数字 - 所以单精度 0.1 出来了“0.1”不是“0.100000001
这是一个家庭作业问题。我已经在网上找到了很多代码,包括StackOverflow中的一些代码。但我只想要概念而不是代码。我想自己实现。所以我要实现的功能是: float_twice - 返回浮点参数
我需要从二进制文件中读取值。数据格式为 IBM 单精度 float (4 字节十六进制指数数据)。我有 C++ 代码从文件中读取并取出每个字节并像这样存储它 unsigned char buf[BU
我需要从二进制文件中读取值。数据格式为 IBM 单精度 float (4 字节十六进制指数数据)。我有 C++ 代码从文件中读取并取出每个字节并像这样存储它 unsigned char buf[BU
假设低端微处理器没有浮点运算,我需要生成一个 IEE754 单精度浮点格式数字以推送到文件。 我需要编写一个函数,它接受三个整数(符号、整数和分数),并返回一个字节数组,其中 4 个字节是 IEEE
我有一个由 NumPy 创建的二进制矩阵。该矩阵有 5 行和 32 列。 array([[1, 1, ..., 1, 1], [0, 1, ..., 0, 1], [1, 1, ...,
我正在尝试通过选择分数 位来创建浮点 NaN。但似乎 python float 在解释 NaN 时总是设置第 23 个小数位(IEEE754 单)。 所以,我的问题是:是否可以在不设置第 23 位的情
有没有办法转换 IEEE 单精度(32 位)列表: String result = getdata(); String[] floats = result.split(","); List float
为什么单精度 float 具有 7 位精度(或 double 15-16 位精度)? 谁能解释一下我们是如何根据分配给 float(Sign(32) Exponent(30-23), Fraction
今天我发现自己在做一些位操作,我决定稍微刷新一下我的浮点知识! 在我看到这个之前,一切都很好: ... 23 fraction bits of the significand appear in th
我想在我的目标板上测试以下内容: 'float' 是使用 IEEE 754 单精度(32 位)浮点变量实现的吗? 'double' 是否使用 IEEE 754 double (64 位)浮点变量实现?
我知道我是否有这样的号码: 1 | 1001 0001 | 0011 0011 0000 0001 0101 000 1 sign bit | 8 bit biased exponent | 23
我确定我遗漏了一些东西。我使用这个代码: int bitsVal = Float.floatToIntBits(f); String bitsString = Integer.toString(bit
我花了几个小时将小数位数更改为 8,而不是使用 VBA Access 的 2。我找到了一些使用此标签来更改系统属性的解决方案: 公共(public)常量 LOCALE_ILZERO = &H12 但它
我是一名优秀的程序员,十分优秀!