更新一下帖文,常常听说有人说数学只需懂加减乘除即可

,
但我弄完这些总觉得我连加减乘除也搞不太懂(

从之前的小数运算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放到附件里
