Board logo

标题: [其他] 浮点数 化 渐进 分数工具fra.exe [打印本页]

作者: slimay    时间: 2021-5-5 11:33     标题: 浮点数 化 渐进 分数工具fra.exe

本帖最后由 slimay 于 2021-5-5 11:40 编辑
FRA.EXE
摘要:浮点数 化 渐进 分数工具。本工具非常适合用于工程近似计算,密码学,钢琴调音等领域。
版本:1.2
-----------------------------------------------------------------------------
用法:(控制台窗口输入命令)

    fra.exe [待转化的浮点数]

-----------------------------------------------------------------------------
示例:
    fra.exe  "3.1415926535"
    fra.exe  "sqrt(pi)"
    fra.exe  "sin1+cos1"   
    fra.exe  "lg5"
    fra.exe  sqrt(5)/2-0.5

-----------------------------------------------------------------------------
补充:
    可使用的数学函数包括
    常数类
        pi    3.1415926535897932
        e     2.7182818284590452       
    通用类
        round 四舍五入
        int   取整
        ceil  向上舍入
        floor 向下舍入
        abs   绝对值
        sqrt  开方
        lg    常用对数,以10为底
        ln    自然对数
        exp   e的次幂
        torad 度转弧度
        +     加
        -     减
        *     乘
        /     除
        %     取余数
        ^     次方
    三角函数类
        sin、cos、tan   
        arcsin、arccos、arctan
    双曲函数类
        sinh、cosh、tanh
        arcsinh、arccosh、arctanh


源码发行,请自助编译,不提供成品,以节省论坛空间
  1. #include<stdio.h>
  2. #include<math.h>
  3. #include "fra.h"
  4. //逼近次数
  5. #define N 10
  6. //定义帮助信息
  7. #define HELP_INFORMATION "\
  8. Float to fraction tool, Copyright@2021~2023 by Slimay\n\
  9.     usage: fra [Float]\n\
  10.     example: fra lg(pi/2)\n\
  11.     version: 1.2\n"
  12. int main(int argc, char** argv)
  13. {
  14. //开关检测
  15. if
  16. (
  17. ( argc == 1 )                       ||
  18. ( argc >  2 )                       ||
  19. ( stricmp(argv[1], "/?") == 0 )     ||
  20. ( stricmp(argv[1], "/h") == 0 )     ||
  21. ( stricmp(argv[1], "-h") == 0 )     ||
  22. ( stricmp(argv[1], "--h") == 0 )    ||
  23. ( stricmp(argv[1], "--help") == 0 )
  24. )
  25. {
  26. //抛出帮助信息
  27. fputs(HELP_INFORMATION, stdout);
  28. exit(1);
  29. }
  30. double c = atof(argv[1]);
  31. //存数分子
  32. double p0 = 0.0f;
  33. double p1 = 1.0f;
  34. double p;  
  35. //存数分母
  36. double q0 = 1.0f;
  37. double q1 = 0.0f;
  38. double q;
  39. double t = c;
  40. for (int i = 0; i < N; i++)
  41. {
  42. int a = (int) t;
  43. p = a * p1 + p0;
  44. p0 = p1;
  45. p1 = p;
  46. q = a * q1 + q0;
  47. q0 = q1;
  48. q1 = q;
  49. t = 1.0/(t - a);
  50. //计算误差
  51. double re = fabs(p/q/c-1.0);
  52. //误差低于30%才显示
  53. if(re < 0.1)
  54. {
  55. printf
  56. (
  57. "%12.0f                                              \n"
  58. " ------------- =%10.8lf ~=%s; Similarity rate [%10.5lf%%]\n"
  59. "%12.0f                                              \n\n"
  60. ,
  61. p,  p/q, argv[1], 100.0 * (1.0-re), q
  62. );
  63. }
  64. if(re < 1e-15)
  65. {
  66. break;
  67. }
  68. }
  69. return 0;
  70. }
复制代码
例如fra 3.1415926535 就得到了最能接近该超越数的分数比值 约率22 / 7,密率355 / 113, 以及 质精率 833719 / 265381 ~=3.14159265358
fra pi的输出结果
  1.           3
  2. ------------- =3.00000000 ~=pi; Similarity rate [  95.49297%]
  3.           1
  4.          22
  5. ------------- =3.14285714 ~=pi; Similarity rate [  99.95975%]
  6.           7
  7.         333
  8. ------------- =3.14150943 ~=pi; Similarity rate [  99.99735%]
  9.         106
  10.         355
  11. ------------- =3.14159292 ~=pi; Similarity rate [  99.99999%]
  12.         113
  13.      103993
  14. ------------- =3.14159265 ~=pi; Similarity rate [ 100.00000%]
  15.       33102
  16.      104348
  17. ------------- =3.14159265 ~=pi; Similarity rate [ 100.00000%]
  18.       33215
  19.      208341
  20. ------------- =3.14159265 ~=pi; Similarity rate [ 100.00000%]
  21.       66317
  22.      312689
  23. ------------- =3.14159265 ~=pi; Similarity rate [ 100.00000%]
  24.       99532
  25.      833719
  26. ------------- =3.14159265 ~=pi; Similarity rate [ 100.00000%]
  27.      265381
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2