喜欢的可以收藏转发加关注
首先, c语言本身没有float在计算时要统统专为double的规定. 那么, 就要考虑一下实际情况了,一般来说, x86的CPU中有两个单元可以被用来计算浮点数, 一个是远古时期传下来的FPU, 另一个是一脉传承的SSE/AVX指令集. (当然我们也可以吃饱了撑的用其他整数指令集去计算浮点数, 但这没有任何意义. )
其中, FPU指令集内部使用80位精度计算浮点数, 无论你读写是多少位, 内部永远是80位计算. 所以一些腐朽发臭不负责任的过时教材中所谓"在计算时会转换成double"这句话, 是从只拥有FPU的远古时期传下来的, 而且还是错的. 然而以今天的角度来看, FPU架构又老, 速度又超级超级慢, 接口还超级超级隐晦, 而且近20年没有任何升级. 根本不是人用的. 也不是现代程序员应该关注的. 除非为了兼容极老的电脑, 在编译浮点操作时编译器自己轻易是不会生成FPU的汇编命令的. 一般开发时也顶多考虑兼容到SSE一代就可以了. 毕竟SSE一代出现在1999年.
那么再说回SSE/AVX, 它和FPU就完全不一样了. 是float就按float计算, 是double就按double计算. 仅仅从指令本身来说, 由于SSE指令集是SIMD流水线指令, 它可以一次处理4个float或者2个double. AVX指令则是一次8个float或者4个double, AVX512则是16个和8个. 从这个角度来看, 仿佛在以流水线方式处理float时, 它的速度是double的2倍. 实际使用时由于各种原因, 并不会出现真的快2倍的情况. 但粗略地说在使用SSE的情况下float比double算的快一些是没太大问题的.
最后, 和一些初学者的直觉不同, "计算"本身并不是影响速度的最大原因. 假设需要的数据已经在寄存器中了, 那么由于现代CPU的微观并行化, 跑一条float指令和跑两条double的SSE指令几乎没有太大速度区别. 真正的问题在于内存吞吐量. float数据的读写显然的比double数据的读写省去了一半的数据量. 在CPU速度和内存速度不成比例的今天, 这个差距在数据量大时非常明显.
学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频
![feddbe8e2d109846f1e420f03b0528f9.png](https://i-blog.csdnimg.cn/blog_migrate/8bf850dfe02482e6d5ed159e40220fe4.jpeg)