假设有 2 个随机数的乘积,每个随机数的长度为 10 到 16 个字符:
1 - 6545134143
2 - 3272567071
在 PHP 8+ 版本中正常工作时,会产生小数点后 14 位的 Float 类型数字:
6545134143 * 3272567071 = 2.1419390471659606E+19
如果通过 GMP 执行相同的操作,您已经获得了所需的小数点后完整位数的数字:
gmp_strval(gmp_mul(6545134143 , 3272567071)) = 21419390471659605153
请注意,对于 GMP,结尾不会四舍五入(从 5 到 6),而是完整呈现 - 605153。
完成运算后,您需要找出这个长数字除以数字 4294967296 的余数,该数字是通过数字与超出标准 64 位整数和 14 个字符的标准精度相乘得到的。
如果您通过 gmp_mod() 执行此操作,那么您将得到您所需要的 - 816336033。我的猜测是,这是某种将这个巨大数字转换为 32 位格式的尝试,因为它与格式非常相似 (& 0xFFFFFFFF) 。
实际上,问题是这样的 - 考虑到 PHP 可能的数值范围的所有细微差别和限制(我们正在谈论 x64 8.3) - 是否有可能以某种方式避免这种巨大的乘法,从整数除法中获得相同的余数(指的是数字本身,而不是特定操作的结果)?我尝试将每个数字分别除以 4294967296,然后将所得余数相乘,但所有数字都归结为 14 位数字,结果纯粹是无意义的。还有一种假设认为这可以通过操纵数字系统来实现......
我想用纯 PHP 来完成它,因为理论上它比调用 GMP 扩展更快,并且在几百万次操作的距离上它应该节省很多秒......
我尝试通过配置将精度移至 16 和 -1 - 结果完全为零,这个词根本没有任何变化。请帮忙和指教)