一个把小数转化为分数的代码(有点问题),有谁能看懂其中的逻辑吗?

本人是个小白,还请各位不吝赐教。
代码如下

#include<stdio.h> 
int main()
{
    double a=0.3;
    printf("a=%lf\n",a);
    long long int b=(long long int)a;
    a=a-(double)b;
    int c;
    long long int m,d;
    d=0;
    m=1;
    int n=0;
    while(a!=0)
    {
        a*=2;
        c=(int)a;
        d=d*2+c;
        m*=2;
        a=a-(double)c;
        n++;
        if(n==63) break;
    }
    long long int x=d;
    long long int y=m;
    long long int z=1;
    n=1; 
    while(z!=0){
        z=x%y;
        x=y;
        y=z;
        n++;
    }
    d/=x;
    m/=x;
    d=d+b*m;
    printf("\n%lld / %lld=%lf",d,m,(double)d/(double)m);
}

这段代码能实现部分小数转化为分数,我不需要知道怎么改,我想知道这里面求出分数的逻辑在哪,实在没看明白,感谢各位。

小数转换为分数分为2个情况,一个是循环小数
思路是将循环节除以对应位个9,比如
0.121212...,转换为 12/99 (因为循环节为2位,所以是99)
再计算最大公约数化简,得到4/33,所以就是4/33
另一个是非循环小数,那么就是小数除以1后面位数个0
比如
0.12,就是12/100
再化简,得到 3/25。

第一个while在把小数转分数,第二个while在求分子分母的公倍数,然后把第一个while得到的分子分母除以公倍数就成了分数
他这种写法基本上来说一定会出现偏差,所以没啥用