質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

6回答

3023閲覧

C言語でエラー「整数の算術オーバーフロー」を回避したい

hir0ki

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/05/19 06:14

前提・実現したいこと

C言語で割り算を行いたいです。

354224848179262000000 / 218922995834555200000

↑かなり桁数が多いので、double型を使ってみたのですが、うまくいきません。
答えは「1.618033988749890」です。

小数点以下まで正確に計算して結果を表示するには、どうすれよいでしょうか…。

発生している問題・エラーメッセージ

コンパイル(bcc32を使っています)時に以下のエラーメッセージが表示されます。

警告:整数の算術オーバーフロー(関数 main)

該当のソースコード

C

1#include <stdio.h> 2 3int main(void){ 4 printf("%lf\n", (double)354224848179262000000 / (double)218922995834555200000); 5  return(0); 6}

試したこと

上述のように整数値をDouble型へ変換しているので、正確にできるだろうと思っていたのですが…
long long型なら良いという情報も見つけ、やってみましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

コンパイラはbcc32、Windows10 Proです。

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

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

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

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

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

y_waiwai

2020/05/19 06:16

うまくいかないとはどうなるんでしょうか
ozwk

2020/05/19 06:24

そもそも答えをどうやって求めたんですか?
hir0ki

2020/05/19 06:26

実行結果はこのようになります:1.618034 かなり正確と考えられる答えはこれです:1.618033988749890 そもそもの答えは、Excelで計算しました。
guest

回答6

0

ベストアンサー

プリミティブな型(intとかlongとかC言語の標準機能でサポートされている)で扱える範囲には限界があります。自分で多倍長型を用意するしかありません。

ちなみに割り算の結果は有限桁に収まるとは限りません(例えば1/3)。これはハードウェア的に実現不可能なので、プログラマは解決できません。なお、分母と分子を別途管理すれば、有理数までなら計算することはできます。

投稿2020/05/19 06:38

HogeAnimalLover

総合スコア4830

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

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

0

浮動小数点数型と誤差

ざんねんながら、あなたの考える正確な結果にはできません


警告:整数の算術オーバーフロー(関数 main)

これを表示させないようにするなら、
(double)354224848179262000000.0 / (double)218922995834555200000.0
としましょう

投稿2020/05/19 06:19

編集2020/05/19 06:35
y_waiwai

総合スコア88042

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

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

0

整数リテラルの時点で整数型で表せる限界を超えているためと思われます。リテラルとしてdouble型として認識してもらう必要があります。私はCはよくわかりませんが、大方末尾に.とかdとかをつければいいのではなかったでしたっけ?

投稿2020/05/19 06:33

swordone

総合スコア20669

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

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

0

#include <stdio.h> int main(void) {   printf("%.20Lf\n", 354224848179262000000.0L / 218922995834555200000.0L);   return (0); }

1.618033988749890
たぶん、最後の桁は違っている。

投稿2020/05/19 06:55

PingHermit

総合スコア478

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

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

PingHermit

2020/05/19 06:58

long double ですが、精度はよく知らない。 long long 程度の桁数の精度はあるはず
maisumakun

2020/05/19 07:08

long doubleと書いてもdoubleと同じ精度、という処理系もあります。
PingHermit

2020/05/19 09:04

bcc32 と処理系が書いてあるので大丈夫です。
PingHermit

2020/05/19 09:08

bcc32は、浮動小数点演算は、大抵、long double で計算して、 あとで、double や float にするので、 メモリが許せば、全部 long double にした方がいいような処理系です。
PingHermit

2020/05/19 09:12

ただ・・・ もう私は bcc32 は持っていないので、bcc32x でコンパイルが通ることまでしかしていないですが(^^;
guest

0

c

1#include <stdio.h> 2 3int main(void){ 4 printf("%.15lf\n", 354224848179262000000.0 / 218922995834555200000.0); //1.618033988749895 5 return 0; 6}

投稿2020/05/19 06:37

ozwk

総合スコア13553

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

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

0

354224848179262000000 / 218922995834555200000 の整数除算結果は1ですが?
あと、  return(0); の行頭に全角空白が入っています。
・・・
Pythonでの結果
In [1]: 354224848179262000000/218922995834555200000
Out[1]: 1.618033988749895

投稿2020/05/19 06:31

編集2020/05/19 06:34
cateye

総合スコア6851

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問