更新一下帖文,常常聽說有人說數學只需懂加減乘除即可

,
但我弄完這些總覺得我連加減乘除也搞不太懂(

從之前的小數運算define可以看出,因為需使用除法而令整個define跑得相當慢,
但存不存在改良的方案?答案是有的

,
在程式語言中, / 除法運算是比 * 乘法運算消耗更多資源,
但我們可以透過 * 乘法來做出 / 除法的效果,從而減輕資源消耗

,
簡單舉個例子,4 * 0.5 結果會等於 2,可看到我們使用的是乘法但相等於把數字除以2

,
而我們也可以透過上述‘’取巧‘’的乘法技巧來改善浮點數除法較慢的問題,
首先,所以我們預先自己使用計算機計算 1.0 / RANDMAX(即是0x7FFFFFFF) 的结果:
好了,我們得出其數值為 4.656612875245797e-10
然後把這數值把本來進行除法替代成乘法

:
新增:
複製程式
//Max inverse size, same as (1.0/0x7FFFFFFF), Used to create Random Float
//32位下最大反轉數值大小, 等同 (1.0/0x7FFFFFFF), 用來產生隨機浮點數
#define INV_MAX 4.656612875245797e-10
然後修改:
複製程式
修改前:
#define randomf(%0) (Float:((float(random(RAND_MAX)) / float(RAND_MAX)) * Float:%0))
#define random_getfloat(%0,%1) (Float:(float(random(RAND_MAX)) / float(RAND_MAX) * (Float:%1 - Float:%0)) + Float:%0)
#define random_slowgetnum(%0,%1) (floatround(((float(random(RAND_MAX)) / float(RAND_MAX) * (%1 - %0 + 1)) + %0), floatround_floor))
修改後:
#define randomf(%0) (Float:((float(random(RAND_MAX)) * INV_MAX) * Float:%0))
#define random_getfloat(%0,%1) (Float:(float(random(RAND_MAX)) * INV_MAX * (Float:%1 - Float:%0)) + Float:%0)
#define random_slowgetnum(%0,%1) (floatround(((float(random(RAND_MAX)) * INV_MAX * (%1 - %0 + 1)) + %0), floatround_floor))
更新後
更新後randomf(20.0) 執行10000次的速度 :
0.000155862280
0.000156527456
0.000156936260
更新後random_getfloat(0.0,20.0) 執行10000次的速度 :
0.0002472922240
0.0001932299120
0.0002426469200
更新後random_slowgetnum(-20,20) 執行10000次的速度 :
0.000420149320
0.000425449232
0.000464830904
可以看到,雖然效能上仍跟原生random_float慢(randomf性能可接近但功能性較弱),
但會比之前直接用除法快


已把更新後的random.inc放到附件裡
