• ベストアンサー

double型の精度

static doubleで配列を作り 0.3454703165とセットして 宣言しました。 しかし、実行してウォッチで見ると 0.345470316499999になってしまいます。 なぜでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

floatでもdoubleでも内部では2進数で数値を表しています。 例として小数点以下は 0.1(2進)・・0.5 0.01・・・・・0.25 0.001・・・・0.125 このやり方で10進数→2進数→10進数とやると必ず元に戻るとは限りません。 2進数の桁数の限界による変換誤差ですね。

関連するQ&A

  • double配列を戻り値としたメソッド

    最近Javaを始めたのですが、あまり知識がなく勘で書いているため今回配列の戻り値でつまずいてしまいました。 プログラムは一応VB,C#,Cをそこそこ書けるだろうといったレベルだと思っています。 問題はタイトル通りなのですが、Tryの中にdouble[] doubFuv = Hunx((int)intpara); として、Hunx(同じクラスにstaticで宣言)は単純に配列を引数分作ってrundi[i] = Math.random();とし、最後にそのままreturn rundiしています。 ここでHunx内でprintlnして実行を確認すると正常に配列に値がはいているのですが、戻り値を受け取った側のdoubFuvには配列の中の幾つかが欠落(本来は0~1までの乱数のはずが、全体の3割に0.0が混入)してしまうといった今まで出会ったことのない状態になっています。 おそらくスレッドで何かぶつかっているのだと思いロックしてみようかと思いましたが、その方法もわからず途方に暮れています。 解決のヒントでもいいので、よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Visual C++でのデバッグ

    配列で宣言した構造体のオブジェクト中のひとつのメンバーをデバッグウィンドウのウォッチで見れないでしょうか。 たとえば struct test {   int a;   double b; }sample[10]; と宣言したとして、sample[0].a~sample[9].aのみをウォッチで見たいです。 実際にやってみたのですが、ウォッチにsampleを入れてしまうとaも表示されてしまいます。

  • 精度が落ちている可能性のエラー

    コンパイル時に 検出値 : double 期待値 : float a = 2.0; 部分に精度が落ちている可能性のエラーがでます。 //Exercise1.java class Exercise1 { public static void main (String args []){ float a; a = 2.0; System.out.println("変数aの値は" + a + "です。"); } } 変数の宣言部分をfloatからdoubleに変えるとエラーは出ません。本の例題としてはfloatなのです。 どういう事なのでしょう? よろしくお願いします。

    • ベストアンサー
    • Java
  •  double (*foo)(double);

     double (*foo)(double); C のコードで上のように宣言されたとき,foo は何を表していますか? プログラミング初心者です. よろしくお願いします.

  • VBAの変数の宣言で数字はすべてDoubleにする

    ご意見教えてください。 VBAの変数の宣言で、数字はすべて、整数も含めてDoubleとして宣言した場合、どんな問題が考えられるでしょうか? また、実行速度が落ちるかも?しれませんが、気になるほど落ちるでしょうか

  • ダブルクォートで囲まれたCSVファイルについて

    CSVを読みこんで配列変換するロジックを考えていますがうまくいきません。 ソースは以下の通りです。 Dim objFs Dim objSm Dim strLine Dim arySplit Set objFs = CreateObject("Scripting.FileSystemObject") Set objSm = objFs.OpenTextFile(C:\sample.csv, 1) Do Until objSm.AtEndOfStream strLine = objSm.ReadLine strLine = Right(strLine, Len(strLine) - 1) strLine = Left(strLine, Len(strLine) - 1) arySplit = Split(strLine, "\"\",\"\"") MsgBox UBound(arySplit) Loop Set objSm = Nothing Set objFs = Nothing ※読み込むCSVファイルはダブルクォートが付いています。 ※正常に配列に変換できたかを確認する為、MsgBoxで配列の要素数を表示しようとしています。 やりたい事は 1.まずは先頭と最後のダブルクォートを除外。 2.区切り文字(\",\")で配列に変換。  ※なぜカンマで配列に変換しないかというとダブルクォートで囲まれた値の中にカンマ文字がある為、このような事をしています。 3.変数に変換した配列を格納。 申し訳ありませんがご教授いただけませんでしょうか。 またどうか皆さんのお知恵を私にお貸しいただけませんでしょうか。 何卒、宜しくお願い致します。

  • 配列と他の変数のメモリ領域重複の問題について質問

    dsPICで配列を使用する際、他の変数もその配列の存在するメモリ領域に配置されてしまいます。 プログラムにはC言語を用いています。環境は「MPLAB C30 v3.31」、「MPLAB LINK30 v3.31」「MPLAB v8.85」です。 状況としてはunsigned char型で要素数320の配列をグローバル宣言します。そしてmain関数やその他の関数内でローカル変数を宣言するとその変数が配列の中に存在することになってしまうというものです。色々試したところ、そのローカル変数をstaticで宣言するとそのような症状は出なくなりました。 この現象には、初期化をする関数内でカウンタとしてローカル変数を宣言し、for文で配列を0でクリアさせようとしたところ、MPLABSIMでデバッグすると永久ループしたことから気づきました。Watchを用いて確認したところ配列の中にそのカウンタ変数が配置されていたため最終的に自分自身を0でクリアしてしまうことで永久ループしてしまうことがわかりました。 なぜこうなるのかよくわかりません。この配列以外にはおおきな領域を必要とする変数は宣言していませんのでData memoryの容量的な問題ではないと思っています。staticで宣言すれば何とかなりますが、これでは無駄なメモリを消費してしまいます。また、絶対アドレス指定をする方法もありますが、「ignoring address attribute applied to automatic 変数名」というwarningがでて結局出来ませんでした。 。 このような現象を起こさせない様にするため,、確実にメモリを確保するためにはどうすればよいのでしょうか。 この問題のために先に進めず、大変困っております。どうかご教授ください。 もう一つ、変数の生存期間について質問なのですが、ある関数内で宣言したローカル変数をカウンタとして使い、指定の回数だけ他の関数を繰り返し実行する場合、他の関数に飛んだ時もそのローカル変数は確実に生存しているのでしょうか。重ねてお願いします。 不足がございましたら補足しますのでお教え下さい。

  • C++のスタック管理

    大きめの配列(2Mくらい)を宣言するとスタックオーバーフローのエラーが発生します。で、配列をstaticにしたらエラーが発生しなくなりました。 なんとなく、初期に大きいバッファを確保するならOKで実行時に確保するとNGなのかな~と思っているのですが、このあたりのことを教えていただけないでしょうか。 なんとなく2Mくらいでオーバーフローが出るのも納得できません。 よろしくお願いします。 環境:VC++ .Net + winXP

  • ダブルクォーテーションのファイル出力について

    文字列をファイル出力する際にダブルクォーテーション(")を表示させるにはどのような方法があるのでしょうか。 私はエクセルのマクロを利用し、Windowsパラメータ設定の簡略化を図ろうかと考えています。 マクロの概要としてはパラメータをエクセルの所定の表に記載し、最後にマクロを実行させることで、 任意のフォルダにパラメータ設定BATファイルを吐き出すといったものです。 その中でIPの設定のBATファイルでつまってしまったので、ご教授下さい。 まず、WindowsでコマンドラインのIP設定にはnetshコマンドを利用します。 たとえば、NIC名:Ethernet、IP:192.168.1.1、サブネット:255.255.255.0、デフォルトゲートウェイ:192.168.1.254 を設定する場合、下記のコマンドを利用します。 netsh interface ip set address Ethernet static 192.168.1.1 255.255.255.0 192.168.1.254 1 マクロではNIC名、IP、サブネット、デフォルトゲートウェイに変数を利用しており、 それぞれNetworkName、IP、Subnet、DefaultGatewayをStringで宣言しております。 VBで上記のコマンドをファイル出力させるときは以下のコードを利用しています。 "netsh interface ip set address " & NetworkName & " static " & IP & " " & Subnet & " " & DefaultGateway & " 1" しかし、NIC名がデフォルトである「ローカル エリア接続」である場合は「ローカル」と「エリア接続」、 の間に半角スペースが入っているため、NetworkNameをダブルクォーテーションで囲う必要があります。 上記のコードでNetworkNameをダブルクォーテーションで囲うにはどのようにすればよいでしょうか。 ちなみにシングルクォーテーションではnetshコマンドでエラーとなります。 宜しくお願いします。

  • staticな有効範囲の配列の作り方(Java)

    ブロック内(ローカル)以外でも使える配列をつくるにはどうすればいいでしょうか? Javaは配列を宣言、生成する必要がありますが、同じ配列を(同じクラスの)複数のメソッドで使うたびに毎回宣言、生成しないほうがコスト削減になると思いましたので。 宣言、生成する位置、それぞれに何かキーワード(static?)をつけるのが条件と思われますがどうでしょうか。 今回はint型の要素数2の配列aを使います

    • ベストアンサー
    • Java