Algorithm 小数到小数的转换算法,它是如何工作的?

Algorithm 小数到小数的转换算法,它是如何工作的?,algorithm,decimal,fractions,Algorithm,Decimal,Fractions,我正在开发一个谐波比率程序,我希望用户能够做的一部分是插入各种比率,并让播放的十进制值频率显示更多的比率锁定频率,这些频率更高或更低 无论如何,在这个网页上有一个javascript算法来显示给定小数的分数值(比率) 它是如何工作的?我对自己实现它很感兴趣,但我并不真正理解它是如何工作的。如果你尝试一些分数,它会给你很多选择(有些有额外的小数),所以它不仅仅是GCD 编辑:如果这个算法问题更适合程序员。请告诉我,我将在那里重新发布并删除它。它正在计算连分数并显示它。连分数中的每一项都会给你另一

我正在开发一个谐波比率程序,我希望用户能够做的一部分是插入各种比率,并让播放的十进制值频率显示更多的比率锁定频率,这些频率更高或更低

无论如何,在这个网页上有一个javascript算法来显示给定小数的分数值(比率)

它是如何工作的?我对自己实现它很感兴趣,但我并不真正理解它是如何工作的。如果你尝试一些分数,它会给你很多选择(有些有额外的小数),所以它不仅仅是GCD


编辑:如果这个算法问题更适合程序员。请告诉我,我将在那里重新发布并删除它。

它正在计算连分数并显示它。连分数中的每一项都会给你另一个分数,这个分数好一个数量级


有关更多详细说明和可选择使用的替代算法,请参阅。

它正在计算连分数并显示连分数。连分数中的每一项都会给你另一个分数,这个分数好一个数量级


有关您可以选择使用的更详细的解释和替代算法,请参阅。

您可以利用IEEE 754,因为您的十进制值很可能存储在其中,并且它使用整数二进制表示法,尾数为整数,指数也可以转换为整数除法,因此您可以提取
a/b
直接从中生成表单。对于32位浮点,我们得到:

1 bit sign
8 bit exponent (with bias 127)
23+1 bit mantissa (the highest bit is not present in binary but it is 1).
现在以
float 3.14159265358979
为例。如果我将此浮点内容读取为整数类型,则它存储为:

0x40490FDB hex
0100 0000 0100 1001 0000 1111 1101 1011 bin
0 10000000 10010010000111111011011 bin
s exponent        mantissa
因此:

如果我把它定义为“代数”方程,我得到:

float = (sign) (mantissa+2^23) / 2^(23-(exp-127))
现在您可以应用GCD或任何您想要的。。。下面是简单的C++代码:

空隙率(int&a,int&b,float c)//a/b~=c
{
并集//浮点和整数表示之间的转换
{
浮动f32;
无符号整数u32;
}x;
x、 f32=c;
int s,e;
s=x.u32&0x8000000;//符号位
a=x.u32&0x007FFFFF;//mantisa
a |=0x00800000;//在mantisa中添加MSB(不在浮点表示中)
e=(x.u32>>23)&0xFF;//指数
e-=0x7F;//使指数重新签名的指数偏差
//(可选)尽可能地除以2(对于GCD来说太懒了,因为b总是2的幂…)最好在e而不是b上进行,以避免可能的溢出
而((a>=2)和((a&1)==0)){a>>=1;e++;}

b=1您可以利用IEEE 754作为您的十进制值最有可能存储在其中,它使用整数二进制表示法,尾数为整数,指数也可以转换为整数除法,因此您可以直接从中提取
a/b
形式。对于32位浮点,我们得到:

1 bit sign
8 bit exponent (with bias 127)
23+1 bit mantissa (the highest bit is not present in binary but it is 1).
现在,以
float 3.14159265358979
为例。如果我将此float内容读取为整数类型,则它存储为:

0x40490FDB hex
0100 0000 0100 1001 0000 1111 1101 1011 bin
0 10000000 10010010000111111011011 bin
s exponent        mantissa
因此:

如果我把它定义为“代数”方程,我得到:

float = (sign) (mantissa+2^23) / 2^(23-(exp-127))
现在,您可以应用GCD或您想要的任何东西…这里是简单的C++代码:

空隙率(int&a,int&b,float c)//a/b~=c
{
并集//浮点和整数表示之间的转换
{
浮动f32;
无符号整数u32;
}x;
x、 f32=c;
int s,e;
s=x.u32&0x8000000;//符号位
a=x.u32&0x007FFFFF;//mantisa
a |=0x00800000;//在mantisa中添加MSB(不在浮点表示中)
e=(x.u32>>23)&0xFF;//指数
e-=0x7F;//使指数重新签名的指数偏差
//(可选)尽可能地除以2(对于GCD来说太懒了,因为b总是2的幂…)最好在e而不是b上进行,以避免可能的溢出
而((a>=2)和((a&1)==0)){a>>=1;e++;}

b=1你知道任何浮点值都是按指数移位的整数…意思是
mantisa/2^exponent
这是两个整数的比率,可以直接从浮点数中获得。然后将bot除以GCD,你应该得到你想要的结果。同样可以通过定点实现…@Spektre你的解释对我来说太简洁了NDESTANDI将注释用示例和C++代码进行更详细的答案,你知道任何浮点数都是指数移位的整数,意思是“代码>尾数/2 ^指数< /代码>,这是两个整数的比值,可以直接从浮点数中获得。然后用GCD将BoT划分出来,你应该得到你想要的。E.用固定点做…@ SpktRe你的解释太简洁了,我无法理解,把这个评论用例子和C++代码来更详细地回答,谢谢链接,这正是我所期待的,非常感谢链接,这正是我所寻找的。