質問するログイン新規登録
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1875閲覧

std::powを使うと値がおかしくなる

mmmisaki

総合スコア34

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2022/02/07 07:13

0

0

目的
ループ文で以下のように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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

この場合は double pow(double, double); が選択されます。

std::pow は用意されているオーバーロードにあてはまらない場合には関数テンプレートを通じた振り分けなおしで対処される仕組みになっていて、直接呼ばれる関数テンプレートはただそれを経由しているだけです。

投稿2022/02/07 09:39

SaitoAtsushi

総合スコア5740

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

std::powは、浮動小数点数バージョンしかありません(cpprefjp)。

longが64ビット、doubleがIEEE 754倍精度という環境の場合、doubleの精度は53ビットしかありませんので、longの幅目いっぱいの数は正確に格納することすらできません。

投稿2022/02/07 07:52

maisumakun

総合スコア146702

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問