目的
ループ文で以下のように9が増えていく動作をさせたいです。
99
999
9999
99999
.
..
999999999999999
不明な点、教えていただきたい点
オーバーフローしない桁地点で値がおかしくなります。
long int の最大値が9223372036854775807に対して、
途中から出力結果が10000000000000000になります。
これは何故なのでしょうか?
オーバロードされているpowは以下なので問題ないように思えます。
constexpr double std::pow<long, long>(long __x, long __y)
該当コード
c++
1#include <bits/stdc++.h> 2#include <cmath> 3#include <climits> 4 5int main(void) { 6 std::cout << INT_MAX << std::endl; 7 std::cout << LONG_MAX << std::endl; 8 std::cout << LONG_LONG_MAX << std::endl; 9 std::cout << DBL_MAX << std::endl; 10 long int val = 9; 11 long int pow10 = 1; 12 13 for (long int i = 1; i <= 18; ++i) { 14 val = std::pow((long int)(10), i) * 9 + val; 15 std::cout << val << std::endl; 16 } 17 // これは問題なく動作する 18 //for (long int i = 1; i <= 18; ++i) { 19 // pow10 *= 10; 20 // val = pow10 * 9 + val; 21 // std::cout << val << std::endl; 22 //} 23}
出力結果
2147483647 9223372036854775807 9223372036854775807 1.79769e+308 99 999 9999 99999 999999 9999999 99999999 999999999 9999999999 99999999999 999999999999 9999999999999 99999999999999 999999999999999 10000000000000000 100000000000000000 1000000000000000000 -9223372036854775808

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。