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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C++

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

Q&A

解決済

2回答

921閲覧

VBAのコードをC++に変換すると値に少し誤差が出る

kitagawasho

総合スコア28

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

C++

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

0グッド

1クリップ

投稿2020/02/25 08:04

前提・実現したいこと

CSVから取得した数値をdouble型の変数に代入すると、下3桁くらいが微妙に書き換わって代入されてしまいます。
ソースコードは、値が一致していることを確認したいため簡単なものにしています。
この値が少しずれているだけで、最後には大きなずれが生じています。
どうすれば値が一致するか教えてください。
値は代入した値と同じにしたいです。

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

double tmp = 720.095428800975; →tmpには「720.09542880097501」が格納される

該当のソースコード

C++

1 2#include <iostream> 3 4int main() 5{ 6 double tmp = 720.095428800975; 7 std::cout << "Hello World!\n"; 8}

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

C++ の double は内部的には浮動小数点数として表現され、一般的には IEEE 754 で定義されている形式を取ることが多いです。 いずれにしても 0 と 1 で表される二進数なわけです。

720.095428800975 を二進数で表したらどうなるでしょうか。 その方法を説明するサイトはたくさんあるのでウェブ検索で上位にあったもののひとつを紹介します。

http://www.it-passport.org/kouza/decimal_to_Binary.html

720.095428800975 は二進数では小数点以下 13 桁から 7812513 桁までを循環する循環小数になるようです。 当然ですが、無限の桁数を格納するわけにもいきませんのである程度のところで切るしかありません。

結論としては double でこの値を正確な形で格納することは不可能です。 十進表現で有限の桁数に見えても二進表現でもそうであるとは限らないのです。

考えられる対策としては

  • 固定小数点にする
  • 十進小数として扱えるようにライブラリを整える

といった方法が考えられます。

投稿2020/02/25 09:28

SaitoAtsushi

総合スコア5444

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

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

0

doubleで精度が足りない場合には多倍長を使えば問題が解決する場合もあります。
本当に無誤差で計算したい場合は有理数で計算したり、数式として扱う方法があります。
有理数を使えるライブラリはGMPなどが挙げられます。

投稿2020/02/25 17:39

Toru3

総合スコア32

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問