比较浮点数和整数
Comparing a float and an int
出于安全原因,我需要执行两次相同的计算,一次只使用整数(int32)变量,另一次仅使用浮点数(float32)变量。在计算结束时,将比较两个结果。
我读了关于比较浮点数的文章。
有几件事我不明白:
-
我没有对浮点数进行以下压缩:假设 a 和 b 是浮点数,这种比较方式是否正确:
if !(a > b) && !(a < b) is true, then _a_ and _b_ are probably identical otherwise not.
-
如果我将浮点数转换为整数,我会得到数字的整数部分,为什么通过使用联合对象并在那里定义与 int32 和 float32 相同的内存,我会得到不同的解决方案?它不是也向 int32 投射浮点数吗?
为什么通过使用联合对象并在那里定义与 int32 和 float32 相同的内存,我得到了不同的解决方案?
float/int union
甚至有意义的唯一原因是因为float
和int
共享32-bits
storage size
。你缺少的是理解floats
(实际上是所有浮点数)都存储在IEEE-754 Floating Point Format
中(浮点数是单精度的,双精度是双精度的,等等)。
当您使用float/int union
技巧时,您会看到integer value
,即float
IEEE-754 Single-Precision Floating Point Format
的integer equivalent
。这两个值与表示相同的数值无关。你可以把他们占据的记忆看作是一个float
,或者一个integer
,因为他们都占据了32-bits
的记忆。如果您通过float
窗口查看,您会发现这些32-bits
作为float
的含义。另一方面,如果您将相同的32-bits
视为integer
,则您看不到如果将其视为integer
的相同32-bits
。查看二进制表示的示例通常会有所帮助。
例如,float
值123.456
。如果您查看内存中的32-bits
,您会看到:
The float value entered : 123.456001
binary value in memory : 01000010-11110110-11101001-01111001
As unsigned integer : 1123477881
IEEE-754 单精度浮点表示是内存中的一种特定浮点格式,由以下 3 个组件组成:
0 1 0 0 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 0 1 0 0 1 0 1 1 1 1 0 0 1
|- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -|
|s| exp | mantissa |
其中s
是sign-bit
,exp
是biased exponent
,其余的23-bits
称为mantissa
。你不可能期望投下float 123.456
并获得任何接近integer 123
的东西,你差了大约7 orders of magnitude
它不是也向 int32 投射浮点数吗?
答:否
- 假。例如,
a
和b
都是nan
,在这种情况下a < b
、a > b
、a == b
都是假的。 - 因为整数和浮点数的表示方式不同。当你将
float
投射到int
(例如,1.0f
投射到1
)时,它们的记忆是不一样的。
-
假
浮点类型的比较与普通类型的整数类型中的比较相同。 如果 a 的值正好等于 b,
a == b
总是返回 true,即12.345 == 12.345
但12.345 < 12.346
。如果需要比较该值是否彼此足够接近,请使用类似 epsilon 而不是==
。但是,对于像NaN或Inf这样的特殊数字,情况就不同了。与 NaN 的比较对所有运算符返回 false!=
-
因为一个处理值,另一个处理对象表示
像
形式(int)some_double_value
这样的简单强制转换为 int 将返回 some_double_value 的值。但是,如果您将其存储到联合中并像这样读出整数,它将返回浮点数内存中的表示例如
(int)2.5 == 2
但 IEEE-754 双精度中 2.5 的二进制表示形式0x4004000000000000
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 使用英特尔内联函数将打包的 8 位整数乘以浮点数向量
- 将字符串转换为浮点数或整数,而无需使用内置函数(如 atoi 或 atof)
- 为什么将两个浮点数相加会得到一个整数C++?
- 浮点数中整数的精确表示形式
- 浮点到整数转换出错(即使浮点数已经是整数)
- 将整数的二进制数据转换为浮点数
- 当我们C++将两个数组的整数除以 时,如何获得浮点数计算;
- C++整数除法到浮点数
- 整数浮点数除以自身是否保证为 1.f?
- 如何使用 c++ 模板实现整数、字符串、浮点数和日期对象的数组
- 根据浮点数选择最小整数类型
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 解析文本文件中的字符串、整数和浮点数
- 正则表达式浮点数和不带逗号的整数
- 如何在不使用对象的情况下连接字符串、整数和浮点数
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 整数/浮点数/字符串值之间的操作,组合太多
- 为什么整数/浮点数乘法会导致不同的结果
- 如何使用zmq/zeromq从传递给python的字符串表示(字节数组)中获取整数/浮点数