重複の可能性:
Objective-Cで小数を分数に変換しますか?
小数形式を分数形式に変換するための簡単なアプリを作成しようとしています。10進数の値はUISliderの値に設定されていますが、小数を小数形式で取得するにはどうすればよいですか?ダブルまたはフロートで宣言する必要がありますか?また、分数形式で印刷するようにアプリに指示するにはどうすればよいですか?
重複の可能性:
Objective-Cで小数を分数に変換しますか?
小数形式を分数形式に変換するための簡単なアプリを作成しようとしています。10進数の値はUISliderの値に設定されていますが、小数を小数形式で取得するにはどうすればよいですか?ダブルまたはフロートで宣言する必要がありますか?また、分数形式で印刷するようにアプリに指示するにはどうすればよいですか?
実数から分数近似を返したいですか?例:0.3333〜"1/3"。これを試してみることができます:
#import <Foundation/Foundation.h>
char out[20];
static char *fractApprox(double r, long d) {
double atof();
int atoi();
void exit();
long m[2][2];
double x, startx;
long maxden;
long ai;
startx = x = r;
maxden = d;
/* initialize matrix */
m[0][0] = m[1][1] = 1;
m[0][1] = m[1][0] = 0;
/* loop finding terms until denom gets too big */
while (m[1][0] * ( ai = (long)x ) + m[1][1] <= maxden) {
long t;
t = m[0][0] * ai + m[0][1];
m[0][1] = m[0][0];
m[0][0] = t;
t = m[1][0] * ai + m[1][1];
m[1][1] = m[1][0];
m[1][0] = t;
if(x==(double)ai) break; // AF: division by zero
x = 1/(x - (double) ai);
if(x>(double)0x7FFFFFFF) break; // AF: representation failure
}
ai = (maxden - m[1][1]) / m[1][0];
m[0][0] = m[0][0] * ai + m[0][1];
m[1][0] = m[1][0] * ai + m[1][1];
sprintf(out, "%ld/%ld",m[0][0],m[1][0]);
return out;
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
printf("%s",fractApprox(0.342343, 999));
}
return 0;
}
コンソール329/961
に出力します。
C言語のアルゴリズムについては、カリフォルニア大学アーバイン校のDavidEppsteinの功績によるものです。
小数を分数に変換する必要があるのはGCDです。例:0.535