- 主题:float和double在存储上有何区别会导致文中的不同?
编译器 clang version 13.0.0
Target: x86_64-pc-windows-msvc
Thread model: posix
其它编译器应该也有类似现象。
就是57,58,59这仨数的结果比较奇怪,是什么原因导致的呢?当然这样写是没有
59*100/100这样好,这样写就没有问题了。
#include <iostream>
using namespace std;
int main() {
cout << int(double(55)/100*100) << endl;
cout << int(float(55)/100*100) << endl;
cout << int(double(56)/100*100) << endl;
cout << int(float(56)/100*100) << endl;
cout << int(double(57)/100*100) << endl;
cout << int(float(57)/100*100) << endl;
cout << int(double(58)/100*100) << endl;
cout << int(float(58)/100*100) << endl;
cout << int(double(59)/100*100) << endl;
cout << int(float(59)/100*100) << endl;
cout << int(double(61)/100*100) << endl;
cout << int(float(61)/100*100) << endl;
return 0;
}
结果:
55
55
56
56
56 //奇怪,为何不是57? 此处用的是double
57
57 //奇怪,为何不是58?此处用的是double
58
59
58 //奇怪,为何不是59?此处用的是float
61
61
--
FROM 119.251.19.*
好奇地试了一下,你的问题在于对丢失精度的强制类型装换的理解,
这种转换不是四舍五入,而是直接截断。
理解了这一点,再试试下面的代码就能懂了
cout.precision(9);
cout << fixed << float(59)/100 << endl;
【 在 luchu 的大作中提到: 】
: 编译器 clang version 13.0.0
: Target: x86_64-pc-windows-msvc
: Thread model: posix
: ...................
--
FROM 183.131.109.*
我就好奇一点,这种代码,编译器不会优化吗?
--
FROM 124.89.33.*
1 64位机器上,float 和double 分别是32位和64位浮点数,虽然很多机器上float上也是8字节大小,他们浮点数存储标准应该是遵循IEEE XXX规则吧,查下编译器中对浮点数或IEEE 浮点标准里面有;
2 程序中数值运算会被编译器预计算,反汇编可以看出来;
3 float 和double 虽然存储单位单元相同,但操作的指令不相同,分别是movss/movsd, divss/divsd, cvttss2si/cvttsd2si
【 在 luchu 的大作中提到: 】
: 编译器 clang version 13.0.0
: Target: x86_64-pc-windows-msvc
: Thread model: posix
: ...................
--
修改:lambdago FROM 111.183.47.*
FROM 111.183.47.*
看编译选项,一般会优化的,
但也必须保证优化(预处理)的结果,必须和处理器解算结果一致。
【 在 echong 的大作中提到: 】
: 我就好奇一点,这种代码,编译器不会优化吗?
--
FROM 111.183.47.*
你要round,不应该加上半精度吗?
【 在 luchu 的大作中提到: 】
: 编译器 clang version 13.0.0
: Target: x86_64-pc-windows-msvc
: Thread model: posix
: 其它编译器应该也有类似现象。
:
: 就是57,58,59这仨数的结果比较奇怪,是什么原因导致的呢?当然这样写是没有
: ..................
发自「今日水木 on 钛星」
--
FROM 222.129.49.*
和float/double没关系,和这个问题有关系的是具体数字
浮点数不是精确表示,你换用/100*1000这样的操作,可以看一下小数点后的情况
转整数的时候,小数点后的都忽略了,即使是.99999这样的情况
【 在 luchu 的大作中提到: 】
: 编译器 clang version 13.0.0
: Target: x86_64-pc-windows-msvc
: Thread model: posix
: ...................
--
FROM 123.112.18.*
float、double的格式是标准的,看看生成的汇编代码和内存中的32/64 unsigned integer值就知道了
这样写是存在编译器的优化计算问题的,是编译阶段的。
所有的优化问题:请对照看汇编代码!!!
--
修改:z16166 FROM 222.129.205.*
FROM 222.129.205.*
发不了文字,水木他大爷的,就发个图。
--
FROM 222.129.205.*