8

C ++では、2/3を計算すると、10進値が出力されますが、0.66666667ではなく元の形式(2/3など)を取得するにはどうすればよいですか?

ありがとう

4

13 に答える 13

10

できません。有理数 (つまり、分数) を保持する専用のクラスを作成する必要があります。または、Boost Rational Number ライブラリを使用することもできます。

于 2011-01-27T16:37:04.420 に答える
8

私の理解が正しければ、浮動小数点数 (floatまたはdouble型変数) があり、この値を分数として出力したいと考えています。

その場合は、質問をさらに指定する必要があります。

  • 定義上、 FP 数分数です。FP数は、仮数mと指数e (および符号ですが、ここでは関係ありません) の 2 つの整数で構成されます。したがって、各 FP 数値は実際にはペア(m,e)であり、それが表す値fはf=mb^eです( bは固定整数ベースで、通常は 2)。したがって、分数としての自然な表現は、単純にm / b^(-e) with e<0です ( e>=0の場合、fはとにかく整数です)。
  • ただし、妥当な除数が最も小さい分数を求めたい場合があります。これは別の質問です。取得するには、たとえば、Pari/GP ライブラリのbestappr関数を使用できます。あなたの場合、おそらくxを入力として使用bestappr(x, A)し、Aを試したい最大の分母として使用します。bestappr は、分母がまだAより小さいxに最も近い分数を返します。
于 2011-01-27T16:48:40.727 に答える
6

除算を計算するための独自のRationalクラスを作成する

class Rational
{
public:
    int numerator, denominator;

    Rational(int num, int den=1){
        numerator = num;
        denominator=den;
    }
    Rational(Rational other){
        numerator = other.numerator;
        denominator = other.denominator;
    }
    double operator / (int divisor){
            denominator *= divisor;
            simplificate();
            return getrealformat();
    }
    Rational& operator / (int divisor){
            denominator *= divisor;
            simplificate();
            return this;
    }
    Rational& operator / (Rational &divisor){
            numerator *= divisor.numerator;
            denominator *= divisor.denominator;
            simplificate();
            return this;
    }
    double operator / (int divisor){
            denominator *= divisor;
            simplificate();
        return getrealformat();
    }
    double getrealformat(){
        return numerator/denominator;
    }
    simplificate(){
        int commondivisor = 1;
        for(int i=2;i<=min(abs(numerator), abs(denominator));i++)
            if( numerator%i == 0 && denominator%i == 0 )
                commondivisor = i;
        numerator /= commondivisor;
        denominator /= commondivisor;
    }
};

使用する

Rational r1(45), r2(90), r3=r1/r2;
cout<<r3.numerator<<'/'<<r3.denominator;
cout<<r3.getrealformat();
于 2011-01-27T17:23:40.873 に答える
4

それらを2つの整数フィールドを持つある種のFractionクラスに格納する必要があります。もちろん、出力に使用する前に分数を単純化する必要があります。

独自のクラスを開発することも、正確な数学のために次のようないくつかのライブラリを使用することもできます。CLN-数値のクラスライブラリ

于 2011-01-27T16:46:16.710 に答える
4

0.66666667 の代わりに元の形式 (例: 2/3) を取得するにはどうすればよいですか?

GMPライブラリのようなものをカスタム出力演算子でラップすることは非常に困難です. 以下に、GMP についてもう少し詳しく説明します。

GMPとは?

GMP は、符号付き整数、有理数、および浮動小数点数を操作する任意精度演算用の無料ライブラリです。GMP が実行されているマシンで使用可能なメモリによって暗示されるものを除いて、精度に実質的な制限はありません。GMP には豊富な機能セットがあり、機能には通常のインターフェイスがあります。

GMP の主な対象アプリケーションは、暗号アプリケーションと研究、インターネット セキュリティ アプリケーション、代数システム、計算代数研究などです。

GMP は、小さなオペランドと巨大なオペランドの両方で、可能な限り高速になるように慎重に設計されています。速度は、基本的な算術型としてフルワードを使用すること、高速アルゴリズムを使用すること、多くの CPU で最も一般的な内部ループ用に高度に最適化されたアセンブリ コードを使用すること、および一般的に速度を重視することによって達成されます。

GMP は、他のどの bignum ライブラリよりも高速です。GMP は漸近的に高速なアルゴリズムを使用するため、多くの操作のオペランド サイズが大きくなるほど、GMP の利点が大きくなります。

最初の GMP リリースは 1991 年に作成されました。これは継続的に開発および保守されており、約 1 年に 1 回新しいリリースが行われています。

于 2011-01-27T16:38:22.410 に答える
3

これは一般的に不可能です。浮動小数点数は正確ではなく、分数を完全に再構築するのに十分な情報を保持していません。

ただし、ヒューリスティックに「最適な」近似を見つける関数を作成することはできます。これにより、浮動小数点数とほぼ同じ値を持つ分数と同様に、分子と分母が小さい分数が優先されます。

コードを完全に制御している場合は、Oliのアイデアの方が優れています。そもそも情報を捨てないでください。

于 2011-01-27T16:36:38.500 に答える
2

分数の分子と分母はすべて整数として格納できます。整数はバイナリで正確に表現されます。

于 2011-01-27T16:40:37.837 に答える
2

作業を簡素化するために、可能であれば既知の分母を使用することをお勧めします。

分数が 2 の累乗の分母に制限されているか、3 (3 分の 1) を使用しているアプリケーションで作業しています。

近似を使用してこれらの分数に変換します (最も近い 1.0/24.0 に丸めます)。

いくつかの制限がなければ、分母を見つけるのは非常に面倒で、多くの実行時間がかかる可能性があります。

于 2011-01-27T18:36:11.610 に答える
0

私は初心者であり、私が使用するこの方法は適切な方法ではない可能性があります

#include <iostream>

using namespace std;
int main ()
{
  double a;
  double b;
  double c;

  cout << "first number: ";
  cin >> a;
  cout << "second number: ";
  cin >> b;

  c = a/b;
  cout << "result is: " << c << endl;

  if (b != 0) {
    if (a > 0) {
      if (c - (int)c > 0 && c - (int)c < 1)
        cout << "fraction: " << a << "/" << b;
    } else {
      if (c - (int)c < 0 && c - (int)c < 1)
        cout << "fraction: " << a << "/" << b;
    }
  }

  return 0;
}
于 2013-06-10T07:12:18.340 に答える
0

両方の数値を HCF で割ると役立つ場合があります。

于 2014-06-09T08:52:26.263 に答える