user-0 提问: C 中单精度和双精度转换问题

回复:
user: user-1
content: 引用 11 楼 feitianhu213 的回复:算了，我还是自己百度+谷歌好了。 百度＋谷歌 也不如 引用 3 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390676437  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-0
content: 算了，我还是自己百度+谷歌好了。

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 引用 7 楼 super_miker 的回复:[quote=引用 6 楼 feitianhu213 的回复:] [quote=引用 5 楼 super_miker 的回复:] [quote=引用 2 楼 feitianhu213 的回复:] [quote=引用 1 楼 super_miker 的回复:] 这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。 可是为什么截断后会变大？不应该变小？如果上述改为：float fa = 1000000000.000000(比 a 多一位) 则可以正常显示，为什么呢？[/quote]  没有人规定截断一定要往下截的，可以往上截、往下截、往零截和往偶数截。。。[/quote] 截断不是去掉一些位吗？既然去掉了，无论是去掉那个位，不应该变小？既然可以表示 1,000,000,000 为什么不可以表示更小的 345,122,907 ? [/quote]  就算是十进制也有四舍五入这种说法你该不会是不知道吧[/quote] 可不可以说的详细点？

user: user-2
content: 引用 6 楼 feitianhu213 的回复:[quote=引用 5 楼 super_miker 的回复:] [quote=引用 2 楼 feitianhu213 的回复:] [quote=引用 1 楼 super_miker 的回复:] 这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。 可是为什么截断后会变大？不应该变小？如果上述改为：float fa = 1000000000.000000(比 a 多一位) 则可以正常显示，为什么呢？[/quote]  没有人规定截断一定要往下截的，可以往上截、往下截、往零截和往偶数截。。。[/quote] 截断不是去掉一些位吗？既然去掉了，无论是去掉那个位，不应该变小？既然可以表示 1,000,000,000 为什么不可以表示更小的 345,122,907 ? [/quote]  就算是十进制也有四舍五入这种说法你该不会是不知道吧

user: user-0
content: 引用 5 楼 super_miker 的回复:[quote=引用 2 楼 feitianhu213 的回复:] [quote=引用 1 楼 super_miker 的回复:] 这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。 可是为什么截断后会变大？不应该变小？如果上述改为：float fa = 1000000000.000000(比 a 多一位) 则可以正常显示，为什么呢？[/quote]  没有人规定截断一定要往下截的，可以往上截、往下截、往零截和往偶数截。。。[/quote] 截断不是去掉一些位吗？既然去掉了，无论是去掉那个位，不应该变小？既然可以表示 1,000,000,000 为什么不可以表示更小的 345,122,907 ?

user: user-2
content: 引用 8 楼 feitianhu213 的回复:[quote=引用 7 楼 super_miker 的回复:] [quote=引用 6 楼 feitianhu213 的回复:] [quote=引用 5 楼 super_miker 的回复:] [quote=引用 2 楼 feitianhu213 的回复:] [quote=引用 1 楼 super_miker 的回复:] 这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。 可是为什么截断后会变大？不应该变小？如果上述改为：float fa = 1000000000.000000(比 a 多一位) 则可以正常显示，为什么呢？[/quote]  没有人规定截断一定要往下截的，可以往上截、往下截、往零截和往偶数截。。。[/quote] 截断不是去掉一些位吗？既然去掉了，无论是去掉那个位，不应该变小？既然可以表示 1,000,000,000 为什么不可以表示更小的 345,122,907 ? [/quote]  就算是十进制也有四舍五入这种说法你该不会是不知道吧[/quote] 可不可以说的详细点？[/quote] 比如0.4四舍五入之后变成0，0.5四舍五入之后变成1

user: user-2
content: 引用 2 楼 feitianhu213 的回复:[quote=引用 1 楼 super_miker 的回复:] 这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。 可是为什么截断后会变大？不应该变小？如果上述改为：float fa = 1000000000.000000(比 a 多一位) 则可以正常显示，为什么呢？[/quote]  没有人规定截断一定要往下截的，可以往上截、往下截、往零截和往偶数截。。。

user: user-3
content: 直接看二进制好了，红色部分就是尾数，float只有23位，你自己数一下 0100000110110100100100100010100001011011000000000000000000000000

user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-0
content: 引用 1 楼 super_miker 的回复:这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。 可是为什么截断后会变大？不应该变小？如果上述改为：float fa = 1000000000.000000(比 a 多一位) 则可以正常显示，为什么呢？

user: user-2
content: 这不是很正常的精度损失吗，float型无法表达这么多位所以进行截断。。。