发布网友 发布时间:2022-04-26 16:43
共3个回答
热心网友 时间:2023-10-15 01:16
1. 你这里的i是浮点数? 浮点数的话似乎是不能这么优化的。 但是c提供一些专门的浮点函数可以做类似的事情(直接处理浮点数的幂次),你去查查看吧
2. 浮点乘除就是有效部分相乘然后调整幂次, 加减就是调整成相同的幂次然后加减。 总的来说浮点数做加减乘除的效率是接近的。(不像整数运算,加减比较快)
3. 在很多芯片上浮点数运算要占用接近20的时钟周期, 在有些芯片上比你估计的20倍差距还要大。 浮点数运算非常低效又非常重要,所以从386时代浮点协处理器就很普及了,后来直接把这个协处理器做在cpu里面, 现在的这些cpu都是带浮点处理器的, 一次浮点运算只需要2,3个时钟周期,这已经跟整数乘法差不多了(有些阉割版本处理器这方面会差一些)。 总的来说如果你考虑的是pc上的编程,那么浮点运算性能只是略差。 但如果你要做其他芯片的编程的话 你必须先了解一下这个板子上到底有没有浮点处理器,没有的话性能差距会非常非常大 ,尽量就别用了
热心网友 时间:2023-10-15 01:17
你要知道准确结果很难,没有实际意义,因为硬件上对于常见运算指令有优化,就同复杂指令集和精简指令集,流水线非流水线,等等硬件上的优化对于因为某个指令上的效率不足影响系统效率的都优化了,浮点数的运算就在这个范围内,只能说个大概的效率比较了
1。在2的N次幂运算是现在的编译环境一般都会自动变为移位运算,所以在这种情况下代码执行结果是一样的。如果比较移位运算和普通乘法运算的效率,指令周期上移位运算要较乘法运算节省1半.但机器周期就是你所感觉到的速度是很难比较的,因为机器级对于不同的硬件结构可能有优化。
2.对于汇编来说浮点运算都是交给浮点运算器,浮点数不支持移位运算,浮点数的运算就是幂和指数的运算,相当于普通的2倍运算量,但浮点运算器内有流水线预处理等优化.一般就一个机器周期就能搞定,可以和整数乘法效率非常接近,或超过。
3.你这里有类型转换操作,是编译器支持,硬件不支持整形和浮点混合运算,编译器编译后会去调用转换操作,需要时间是单一类型(不要浮点和整型混合)运算的2倍。单一类型来说浮点和整数运算的运算时间是差不多的,可能浮点还要快点(看CPU,一般的CPU还是整数运算快)。
不要在浮点和整数上犹豫,只要不要频繁的类型转化,两者预算效率非常相近或相同。 否是在运算时间上不管有没硬件优化(不排除有混合运算的硬件优化,有的话那就太*了),至少两倍运算时间!!
千万别频繁的类型转换!!
热心网友 时间:2023-10-15 01:17
1、(int) i * 2;这样的行为可以优化为 i<<2;如果不优化,那么实际计算机做的操作是?或者说i * 234,计算机是进行低级储存单元上的运算的?
Answer:
i * 2 => i << 1.
具体计算机硬件怎么做,你去查一下乘法器的硬件实现吧。乘法器是CPU里面的一个功能单元。
2、同样的,对于浮点,是如何进行乘法和加法运算的?(重点)
Answer:
浮点数的运算是由CPU里面的FPU来执行的。其实和整数的方法类似,不过需要乘之前把小数点对齐。
3、同样的运算,比如(float) i * 2;跟(int) i * 2;之间的代价差别到底有多大?我要的是确数,比如1是2的20倍代价之类的(但是我想没那么高吧?)(重重点)
Answer:
代价的比例,和分子分母都有关系。
在Intel Core2 45nm CPU上,signed 32-bit integer MUL的cycle是3. float是5. 差不多的。
和不同CPU的实现有关。具体你需要查询每种CPU的参考手册。
当然,如果你有兴趣,自己写个测试程序测一下也可以。用一个很长的数组来测。呵呵