; /frac | $frac | /frac 3.14 | $frac(3.14) | $frac().ticks
frac {
; requires mIRC 7.72 bigfloat
var %ticks = $ticks
if (!$isid) window -asdDoe2izj100000M -t0,31,62 @frac $iif(!$window(@frac),-1 -1 900 600)
clear @frac
if (!$1) /tokenize 32 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
var %whole = $int($1)
var %decim.bf = $calc($1)
var %min_numer = %whole, %min_denom = 1
var %max_numer = %whole + 1, %max_denom = 1
var %mid_numer, %mid_denom, %frac, %frac.bf, %delta.bf
while (1) {
%mid_numer = %min_numer + %max_numer
%mid_denom = %min_denom + %max_denom
%frac = %mid_numer $+ / $+ %mid_denom
%frac.bf = %mid_numer / %mid_denom
%delta.bf = %frac.bf - %decim.bf
if (!$isid) {
aline @frac $gettok(%delta.bf,2,46) $+ $chr(9) $+ %delta.bf $+ $chr(9) $+ %frac $+ $chr(9) $+ %frac.bf
}
if (%delta.bf < 0) {
%min_numer = %mid_numer
%min_denom = %mid_denom
}
elseif (%delta.bf > 0) {
%max_numer = %mid_numer
%max_denom = %mid_denom
}
else {
if (!$isid) echo -a done $calc($ticks - %ticks) ms. %frac = %frac.bf
if ($prop == ticks) return $calc($ticks - %ticks)
return %frac
}
}
; https://stackoverflow.com/a/5128558/8805628
} ; Raccoon 2022