Skip to content

Instantly share code, notes, and snippets.

@k06a
Last active August 25, 2022 14:56
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save k06a/af6c58fe6634e48e53929451877eb5b5 to your computer and use it in GitHub Desktop.
Save k06a/af6c58fe6634e48e53929451877eb5b5 to your computer and use it in GitHub Desktop.
log_2_rand_0_1
/*
* ABDK Math 64.64 Smart Contract Library. Copyright © 2019 by ABDK Consulting.
* Author: Mikhail Vladimirov <mikhail.vladimirov@gmail.com>
*/
pragma solidity ^0.5.7;
/**
* Modified version of this code:
* https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol#L366
*
* Modifications:
* - input considered as random and trunctaed to (0..1] random value
* - returning value multiplied by 1e18, precision decreased to 6 decimals digits
*/
contract ABDKMath64x64_Modified {
//
// Example 1:
// log2(0.19891989) => -2.3297405564
// 3669424302000455899 => 2329741477966308593
//
// 1. 0.19891989 * 2^64 => 3669424302000455899
// 2. log_2_rand_0_1(3669424302000455899) => 2329741477966308593
// 3. 2^(-2329741477966308593/1e18) => 0,1989197629 (with precision 1e-6)
//
function log_2_rand_0_1(uint256 x) public pure returns (uint256) {
x &= 0xFFFFFFFFFFFFFFFF;
require(x > 0);
uint256 a = 63;
while ((x >> a) == 0) {
a--;
}
uint256 result = a - 64 << 64;
uint256 ux = x << 127 - a;
for (uint256 bit = 63; bit > 43; bit--) {
ux *= ux;
result |= ((ux >> 255) << bit);
ux >>= 127 + (ux >> 255);
}
return uint256((-int256(result) * 1e18) >> 64);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment