[问题] int与float的问题

楼主: andy15281528 (阿狄)   2019-01-29 22:34:56
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
问题(Question):
最近看到的题目
关于int与float的转换问题
已知int为整数型态,float为浮点数,资料转换会有遗失风险
宣告int放入16进位 0x7FFFFFFF
也就是10进位的2147483647
放入float型态后数值会+1
可是根据我对IEEE754的解释
算出来的应该会是 2147483520 才对
另外一个疑问是
为什么在main function
从float传入到int变回 2147483647
但是pass by value传入到function后
放入int型态和回传都会是-2147483648
目前有从float浮点数运算,return架构去考量,但还是想不出原因
所以想要请教各位大大们
底下有完整程式码及输出可以参考
感激不尽
程式码(Code):(请善用置底文网页, 记得排版,禁止使用图档)
https://ideone.com/VXE1Hl
作者: stupid0319 (征女友)   2019-01-29 22:44:00
int没有2147483648这个数float精度好高,可能被优化到64bit的mmx暂存器上了如果都是放在FPU,或是MMX,是足够放int整数值的
作者: LPH66 (-6.2598534e+18f)   2019-01-30 00:30:00
这里什么问题都没有, 因为 2^32 可以被 float 表示IEEE 规定是 round to nearest (四舍五入)(这里是二进制所以应该叫零舍一入, 不过就是这个概念)所以遗失的被零舍一入了, 那因为丢掉的都是一所以进位进位就变成 1.0000*2^32 是个可以完整在 float 里储存的数一个观念: IEEE754 浮点数就是二进制的科学记号这里用科学记号的概念来讲就只是取固定位数后进行舍入大约就是十进制 99999999 取五位变成 1.0000*10^8 的感觉
作者: stupid0319 (征女友)   2019-01-30 08:01:00
原po可以设计多个int跟float测试这有关暂存器的使用跟有没回存回内存测了一下a代0x7FFFFFE0, float一样出2147483648.00000精度还是有误差的,不要乱用浮点数当int用原PO的理解其实是没错的,多测几个数值
作者: suhorng ( )   2019-01-30 09:31:00
记得是 round to even, 在二进制不是零舍一入, 而是一可能舍去也有可能进位, 总之是要弄到偶数
作者: LPH66 (-6.2598534e+18f)   2019-01-30 15:31:00
就是这样而已没错, 沿用我最后一行推文的类比来说就是 99999499 / 99999500, 同样取五位前者舍去后者进位

Links booklink

Contact Us: admin [ a t ] ucptt.com