タイトルにあるようなことをしたい:
int number1;
cin>>number1;
num1len=log10(number1)+1;
cout<<"num of digits is "<<num1len<<"\n";
ただし、桁数が 11 以上の場合、答えは常に7(6+1)
誰かがなぜ、または私が間違っているのか知っていますか?
を含む浮動小数点データ型は、近似値double
を格納します。呼び出して見つけているのは、小数点の左側の桁数です。これは、近似プロセスによって最大で 1 つの影響を受けます。log10
あなたが尋ねた質問、バイナリ浮動小数点に格納された数値の10進数の桁数を見つける方法は無意味です。数値7.1
には 2 桁の 10 進数がありますが、近似浮動小数点表現では 10 進数はまったく使用されません。10 進数の桁数を保持するには、C++double
データ型ではなく、10 進数表現が必要です。
もちろん、これはすべてdouble
、質問のタイトルに従って、にのみ適用されます。コード スニペットは実際には使用しませんdouble
。
「間違っている」のは、(signed) int に格納できる最大値です。
#include <iostream>
#include <numeric>
int main()
{
std::cout << std::numeric_limits<int>::max() << std::endl;
}
私に与えます:
2147483647
符号なし32ビット境界を超えて実行しています...11桁以上の数が0xFFFFFFFFを超えているため、ラップアラウンドします。
unsigned long long
または変数に次のいずれかdouble
を使用する必要があります。number1
#include <iostream>
#include <cstdlib>
#include <cmath>
int
main ( int argc, char * argv[] )
{
unsigned long long num; // or double, but note comments below
std::cin >> num;
std::cout << "Number of digits in " << num << " is " << ( (int) std::log10 ( num ) + 1 ) << std::endl;
return 0;
}
std::cout
これらの大きな数値は、データ型として使用することを選択した場合、送信時にデフォルトで科学的記数法で出力さdouble
れるため、そこに何らかの書式を設定することをお勧めします。unsigned long long
代わりに使用する場合は、入力したとおりに印刷されますが、プラットフォームがをサポートしていることを確認する必要がありますunsigned long long
。
編集:他の人が述べたように、浮動小数点値の使用には考慮すべき他の影響があり、最終的に達成しようとしていることではない可能性があります。AFAIKは、最大の正の値を生成するプラットフォームの積分型ですunsigned long long
。したがって、使用する値に応じて、それが使用可能かどうかを確認してください。
他の人は、浮動小数点数は近似値であるため、実際には正確な桁数を取得できないと指摘しています。
しかし... std::stringstream オブジェクトに書き込んで std::string に変換し、その文字列の長さを取得することで、おおよそのものを取得できます。もちろん、文字列に数字以外の文字が含まれる可能性があるという事実に対処する必要があります (マイナス記号、小数点、指数の E など)。また、この方法で取得する桁数は、stringstream オブジェクトへの書き込み時に選択した書式設定オプションに依存します。ただし、使用する書式設定オプションがわかっていると仮定すると、これらのオプションの対象となる桁数を取得できます。