浮動小数点数を比率に変換するには?

浮動小数点数を比率に変換するには?

浮動小数点数を比率または分数に変換したいと思います。

Pythonと同様に浮動小数点を1.778比率に変換する16:9か、bashに変換するオプションはありますか?16/9噴水モジュールFraction(1.778).limit_denominator(100))。

ベストアンサー1

awk -v prec=0.001 -v max=2000 '
   function fract(n, k, kr, d){
       for(k=n;k<max;k+=n){
           kr=int(k+.5); d=kr-k; if(d<0)d=-d;
           if(d<prec){return kr"/"k/n}
       }
       return n" ??"
   }
   BEGIN{for(i=1;i<ARGC;i++)print fract(ARGV[i])}
' 3.1415926535 1.77777777 0.333333 2.71828 1.61803398
355/113
16/9
1/3
1264/465
987/610

繰り返し加算の代わりに乗算するとより正確になりますが、これが遅くなる可能性があります。

awk -v prec=0.00005 -v max=20000 '
   function fract(n, k, kr, kf, d){
       for(k=1;k<max;k++){
           kf=n*k; kr=int(kf+.5); d=kr-kf; if(d<0)d=-d;
           if(d<prec){return kr"/"k}
       }
       return n" ??"
   }
   BEGIN{for(i=1;i<ARGC;i++)print fract(ARGV[i])}
' 3.14159265358979323846 1.7777777 0.33333333 2.7182818 1.61803398
355/113
16/9
1/3
34109/12548
24476/15127

max「調整可能」は実際にはmax_numerator / orig_num2番目のバージョンにあります)。

おすすめ記事