|
How about a brute force attack, which may be slow depending on the precision
cap prog drop d2f2
prog d2f2
args f precision
tempname df num den
sca `num' = 1
sca `den' = 1
sca `df' = `num'/`den'
while abs(`df'-`f') > `precision' {
if (`df' < `f') {
sca `num' = `num' + 1
}
else {
sca `den' = `den' + 1
sca `num' = int(`f' * `den')
}
sca `df' = `num' / `den'
}
sca num = `num'
sca den = `den'
end
qui {
sca x=-3.14159265358979
sca absx = abs(x)
sca intg = int(x)
sca frac = abs(abs(x)-int(abs(x)))
sca num = 0
sca den = 0
d2f2 frac 1e-7
local xx = x
local numm = num
local denn = den
local intgg = intg
if intg != 0 {
noi di as text "`xx' = `intgg' `numm'/`denn'"
}
else {
noi di as text "`xx' = `numm'/`denn'"
}
}
|