C++クラスの変更カウンタープログラムを作成しています。私たちが使用している数値は数十兆であり、それを浮動小数点型変数に格納してから整数型にキャストする簡単な方法があるかどうか疑問に思いました。これは整数リテラルではなく、入力として受け入れられ、変更の可能性があると思います。
3 に答える
フロートを使用しないでください。整数として保持し、64 ビットの long を使用します。これらの整数を格納するための型として「long long」または「int64_t」を使用します。後者は#include <stdint.h>
int main()
{
long long x = 1450000000000LL;
printf("x == %lld\n", x);
return 0;
}
うーん。いいえ:D
ただし、行列を使用して、使用する必要がある数学演算用の関数を作成できます。非常に大きな数で多くのことや算術を行っている場合は、 http: //gmplib.org/をご覧ください。
浮動小数点演算を使用して変更カウンターを表すと、深刻な問題が発生します。なんで?- あなたは、1、10、100 など (IIRC) 10^6 までの異なる値を表す問題につながる精度の問題の犠牲者です。(「兆」という用語の 10^12 バージョンを参照していると仮定します。これについてより深い洞察が必要な場合は、H. Schmidt のIEEE 754 コンバーター ページと、これに関するウィキペディアの記事を参照してください)
したがって、数百万を超える精度が必要な場合 (そして、私はあなたがそうしていると思います)、浮動小数点のような獣を使用すると、本当にお湯になります。数値を計算できるようにするには、GNU の ( 倍精度ライブラリのようなものが本当に必要です。もちろん、同じ機能を自分で自由に実装できます。
あなたの場合、64ビット整数でそれができるかもしれません。(long long は必ずしも 64 ビットではなく、C89 では非標準であることに注意してください) 次のようにして、ユーザー入力を自分で解析するだけです (未テスト、アイデアを説明するためだけに):
const char input[] = "14.5"
uint64_t result = 0;
uint64_t multiplier = 1000000000000;
unsigned int i = 0;
/* First convert the integer part of the number of your input value.
Could also be done by a library function like strtol or something
like that */
while ((input[i] != '.')
&& (input[i] != '\0'))
{
/* shift the current value by 1 decimal magnitude and add the new 10^0 */
result = (result * 10) + (input[i] - '0');
i++;
}
/* Skip the decimal point */
if (input[i] == '.')
{
i++;
}
/* Add the sub trillions */
while (input[i] != '\0')
{
/* shift the current value by 1 decimal magnitude and add the new 10^0 */
result = (result * 10) + (input[i] - '0');
multiplier /= 10; // as this is just another fraction we have added,
// we reduce the multiplier...
i++:
}
result = result * multiplier;
もちろん、結果のオーバーフローや数字以外の文字の適切な処理など、個別に処理する必要があるいくつかの例外がありますが、上で述べたように、コードはアイデアを説明するためだけのものです。
PS: 符号付き整数の場合、もちろん負符号も処理する必要があります。