c++ float转double_萌新求教//c语言float和double哪个算得快?

喜欢的可以收藏转发加关注

首先, 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值