• 締切済み

javascriptで浮動小数点の問題

javascriptで浮動小数点の問題を解決しつつevalをつかった電卓を作ることはできませんか? >>> //-が欲しい場合 var array2 = str.match(/-?[0-9]+\.?[0-9]*/g); for(var i = 0; i < array2.length; i++) { console.log(parseFloat(array2[i])); } な感じで数値を抜き出し 計算記号+-*/に従ってmathのメソッドを順次呼び出す関数を作成すればいいのです。 計算記号については抜き出した数値を文字列として数えれば抜き出せるはず。 このように教えてもらいましたが、正直難しすぎてさっぱりわかりません。 evalでは浮動小数点の問題は解決できないのでしょうか? 便利なライブラリなどもないでしょうか?

みんなの回答

回答No.21

>回答No.20 amanojaku1 >「加算、減算」と「乗算、除算」の整数化と小数点に戻す処理は非常に困難になります。 「加算、減算」と「乗算、除算」の混在している式では整数化と小数点に戻す処理は非常に困難になります。

回答No.20

>特殊な計算を除いて一般的な計算が問題なければいいかなと思っているのですが、一度整数にして計算してから小数点を戻すだけでは一般的な計算でも誤差が大きくて使い物にならないのですか? 一般的な計算「2042/100*23450*123」でも億単位未満でも誤差がでます。 例えば「20.42/100*23450*12.3」を整数化すると、整数化した部分は上記と全く同じになり、当然 億単位未満で誤差がでます。 小数点に戻す時に数値ではなく文字で処理しないとダメです(数値だと小数点自体で誤差がでます)。 また、良く考えたら「加算、減算」と「乗算、除算」の整数化と小数点に戻す処理は非常に困難になります。 例えば「2.042*2.345+1.23」の場合「2042*2345」とすると「1000倍*1000倍」で「1.23」側は「1000000倍」しないと桁が合わなくなります。 電卓の計算:2.042*2.345+1.23=6.01849 電卓の計算:2042*2345+1230000=6018490、電卓の計算:6018490/1000000=6.01849:証明終わり 下記のように正規表現で構文を解釈し「「加算、減算」と「乗算、除算」の優先順位を無視して記述されてる順番で演算、カッコも使わない」で「bigdecimal.js」で処理した方が簡単です。 >bigdecimal.jsを使えば、evalでも簡単に誤差を修正できるならこれを使ってみます。 bigdecimal.jsはevalでは使えません。 「加算、減算」と「乗算、除算」の優先順位を無視して記述されてる順番で演算、カッコも使わないなら、正規表現で構文を解釈し「bigdecimal.js」で それほど難しくないと思われます。

回答No.19

>okwebの問題ですが、どれが最新のご返信かわからないのですがこちらでしょうか? 「新着順」(添付画像の赤で囲った部分)をクリックして下さい。 >特殊な計算を除いて一般的な計算が問題なければいいかなと思っているのですが、一度整数にして計算してから小数点を戻すだけでは一般的な計算でも誤差が大きくて使い物にならないのですか? 整数の演算で下記のように誤差がでる訳ですので、(加算、減算、乗算だけなら良いのですが)除算が入ると「一度整数にして計算する」と言うアイデアには欠陥があると言う事です。 Math.round(eval(2042/100*23450*123)*100000000)/100000000=58898427.00000001

回答No.18

>このようにして、整数化して計算することで、基本的に問題なく小数点の計算もできているように見えます。 > >ただ前におっしゃっていた通りこちらだと小数点の計算と10桁くらいの計算なら問題ないが何億くらいの計算になるとまた計算がおかしくなるのでしょうか? > >億単位ならほとんどだれも行わないので無視してもいいかなとも思っています。 下記は億単位未満でも誤差がでます。 やはり「bigdecimal.js」を使った方が良いかと思います。 <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS"> <!-- charset=Shift-JIS、UTF-8 --> <TITLE>test</TITLE> </head> <body> <script type="text/javascript"> <!-- document.write(eval(2042/100*23450*123)+'<br>'); document.write(Math.round(eval(2042/100*23450*123)*100000000)/100000000+'<br>'); --> </script> </body> </html>

mousugusokoni
質問者

お礼

okwebの問題ですが、どれが最新のご返信かわからないのですがこちらでしょうか? 特殊な計算を除いて一般的な計算が問題なければいいかなと思っているのですが、一度整数にして計算してから小数点を戻すだけでは一般的な計算でも誤差が大きくて使い物にならないのですか?

mousugusokoni
質問者

補足

>> 下記は億単位未満でも誤差がでます。 やはり「bigdecimal.js」を使った方が良いかと思います。 私のやり方だと普通の計算でも誤差が出るのでしょうか? bigdecimal.jsを使えば、evalでも簡単に誤差を修正できるならこれを使ってみます。

回答No.17

>結局「bigdecimal.js」でも「1/3*3=」とかだと誤差がでます。 目標が電卓レベルなら「bigdecimal.js」は桁数が多いと思われるので下記のような手法で丸めても良いと思います。 >2042/125*375=6125.999999999999 >↑この場合"9"が12個ありますが、余裕を持たせて"9"が8個以上あったら8個目の"9"を四捨五入するとか。 >2042/666*375*777=893375.0000000001 >↑この場合"0"が9個ありますが、余裕を持たせて"0"が8個以上あったら9個目以降の数字を切り捨てるとか。

回答No.16

>回答No.15 amanojaku1 結局「bigdecimal.js」でも「1/3*3=」とかだと誤差がでます。

回答No.15

>回答No.14 amanojaku1 「加算、減算」と「乗算、除算」の優先順位を無視して記述されてる順番で演算、カッコも使わないなら、正規表現で構文を解釈し「bigdecimal.js」で それほど難しくないと思われます。

回答No.14

>結局JSでは何をやっても小数点以下が多い計算を正確に出すことは不可能なことに変わりはないのですね。 「bigdecimal.js」とか10進演算ライブラリを使うしかないでしょう。

回答No.13

>回答No.12 amanojaku1 もちろん、その方法でも、誤差が大きくて それで対応できないほど誤差が大きいとダメなんですが。

mousugusokoni
質問者

お礼

>>>> 2042/125*375=6125.999999999999 ↑この場合"9"が12個ありますが、余裕を持たせて"9"が8個以上あったら8個目の"9"を四捨五入するとか。 2042/666*375*777=893375.0000000001 ↑この場合"0"が9個ありますが、余裕を持たせて"0"が8個以上あったら9個目以降の数字を切り捨てるとか。 結局JSでは何をやっても小数点以下が多い計算を正確に出すことは不可能なことに変わりはないのですね。

回答No.12

>そしてもう一つ別の電卓を作ってそちらではそのままこの問題を放置するという二つのバージョンを作るしかないかなと思ったのですが、これでまず問題ないと思っていいでしょうか? 1度文字列に変換して正規表現も利用して四捨五入すると良いでしょう。 2042/125*375=6125.999999999999 ↑この場合"9"が12個ありますが、余裕を持たせて"9"が8個以上あったら8個目の"9"を四捨五入するとか。 2042/666*375*777=893375.0000000001 ↑この場合"0"が9個ありますが、余裕を持たせて"0"が8個以上あったら9個目以降の数字を切り捨てるとか。

関連するQ&A

  • 浮動小数点について

    独学でプログラミングの勉強をしています。Wiki等で調べたりしましたが、 下記テキストの質問の計算が全く分かりません。 分かりやすく説明して頂けるとありがたいです。 宜しくお願い致します。 質問: 二つの浮動小数点の数字があり、SEEMMMM(S=符号付数値、E=指数、M=仮数)の形式で表示されています。 指数はエクセス数50、仮数は符号付数値、小数点は右の仮数に表示されます。 0 53 1110 0 50 3020 二つの数字を加算し、正しく表示された浮動小数点形式と実数をすべての計算式も含め表しなさい。

  • 浮動小数点について

    当方、浮動小数点を勉強しているのですが、 テキストの解説を読んでも理解が出来ません。 正規化とか指数と仮数の意味が分かりません。 そこで質問なのですが、浮動小数点の計算方法を教えて下さい。 IEEE形式の浮動小数点も教えて頂けると助かります。 また、下記の問題について解説して下さい。 数値を16ビットの浮動小数点表示法で表現する。 形式は図に示す通りである。10進数0.375を正規化した表現は、どれか。 ここでの正規化は、仮数部の有効数字よりも上位の0が無くなるように、 指数部を調節する操作である。 (図は添付します) 何故「E」の値が「1111」になるのでしょうか。 お手数ですが、ご教授お願いします。 尚、特に分かり易いホームページがあったら、 そのURLを記載して頂いても結構です。 以上、よろしくお願い致します。

  • 浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で最小値を求めるにはどういう計算をすればいいのでしょうか?また調べた数値だと最小値 1.175494351E-38 最大値3.402823466E+38のところ±3.40282347E+38 ~ ±1.40239846E-45のところがあるのですがどちらが正しいのでしょうか?

  • iアプリで浮動小数点を使いたい

    iアプリで確立を計算したいのですが、浮動小数点が使えないので困っています。 整数演算で浮動小数点を扱うクラスを自作するしかないのでしょうか? 使えそうなクラスなど、ご存知でしたら教えてください。

    • ベストアンサー
    • Java
  • 『浮動小数点』について

    最近、ふと『浮動小数点』について疑問を持ちました。 それは『浮動小数点』がどんな場合に役立つのか?という事です。 C言語では標準で『float』型と『double』型がありますよね。 私は昔、C言語を始めたころにテスト・プログラムなどで使った経験しかなく その後に『電卓ソフト』を作ろうとしたときに『誤差』が原因で役に立たない ことを知りました。『誤差』があることは知っていましたが…。 そこで質問。内容は『浮動小数点』はどんな場面で利用されているかです。 実際の『ソフトウェア開発』や趣味でフリーソフトを作った場合も含み、あと こんな場面で役に立つのではという事を知りたいのです。 アンケートみたいになりますが、『アンケート』カテゴリでは、あまり回答などが 集まらないと思い『C/C++』カテゴリのこちらで質問としました。 よろしくお願いします。

  • 浮動小数点の計算について

    Javaで0.1+0.2を計算すると0.30000000000000004になったり、10.0-9.9を計算すると、0.09999999999999964になったりするのはなぜですか? 参考書では。 「浮動小数点数を使った計算では、一見正確な値が計算されてるように見えてもほとんど場合内部では少しだけ誤差を含んだ値を持ってると、考えた方がいいでしょう。どのような計算を行った時にどの程度の誤差が出るのかは難しい話題になるのでこの本では詳しく説明しませんが、例えば100.0-99.99のように同じぐらいの数同士で引き算を行うと誤差が現れやすくなります。」 と書いてありました。 この本ではこれだけで説明が終わりました。 なぜ浮動小数点で計算を行うと誤差が出るのか詳しく教えていただけると助かります。

    • ベストアンサー
    • Java
  • 浮動小数点変換

    (1)次の数値をIEEE754単精度形式で正規化された浮動小数点に変換し、結果を8桁の16進数で表記しなさい。 (a)0.5 0.5を二進数で表すと0.1 0.1*2^0であるから 0 00000000 10000000000000000000000 (b)1.0 1.0を二進数で表すと1.0 0.1*2^1であるから 0 10000000 10000000000000000000000 (c)1.25 1.25を二進数で表すと1.010 0.101*2^1であるから 0 10000000 10100000000000000000000 浮動小数点への変換、あってますでしょうか? また結果を8桁の16進数で表記とありますが 0.5だったら16進数で表すと0.9?これを8桁*16^なんとか乗で表すということでしょうか?

  • 浮動小数点形式の問題

    数値を32ビット浮動小数点形式で表す。指数部は2を基数とし、負数は2の補数で表現する。10進数0.375をこの2を基数とした浮動小数点形式で正規化したものはどれか。ただし結果は16進数で表現する。 答え:7FC00000 という問題です。 まず0.375を2進数に 0.011 正規化 0.11 * 2^-1 指数部-1を2進数で求める -0000 0001 ->1111 1111 仮数部符号は正の数なので0 0111 1111 ???? ???? ???? ???? ???? ???? と・・・ ここの部分からわかりません・・・ (なぜか手持ちの参考書には省略してあり・・・) 7Fの部分はこれで間違いないでしょうか? またそのあとのC00000 はどうやって導くのか教えてください。 お願いいたします

  • 「浮動小数点表示」と「丸め」について

    数値解析についての質問です。 「23.49を有効数字4桁の浮動小数点表示で書け」という問題があるときは 0.2349 * 10^2 と答えるのが正しいのでしょうか。 つまり「浮動小数点表示で答えよ」とあれば、 0.○○○... * 10^○の形で書けば良いのでしょうか。 また、数値の丸めの仕方に関する質問なのですが、教科書に以下のような記述がありました。 k+1桁以降の数を切り捨てる a.この切り捨てられた数が第k桁の単位の半分より小さいときは、第k桁の数はそのままにする。 b.もし半分より多きときには第k桁の数に1を加える c.この切り捨てられた数が第k桁のちょうど半分のときには最も近い偶数に丸める とあるのですが、その後の記述で 「1.2535をそれぞれ小数点以下3桁、2桁、1桁で丸めると、1.254,1.25,1.3が得られる」また「小数第3位以下の情報なしで、1.25を1桁で丸めると1.2になる」とあるのですが、 後者が1.2になるのは理解できるのですが、最初の規則に則ると前者も1.2になるように思うのですが、何故1.3になるのでしょうか。 以上の規則に則った上で以下の問題に答えてみました。 問.-89.216618, 500000, -0.002213675を丸めて有効数字5桁の浮動小数点表示で書け 僕の答え -0.89217 * 10^2 0.50000 * 10^6 -0.22137 * 10^-2 というのは合っていますでしょうか。 質問が多くて大変恐縮ですが、解説、ご指摘をお願いします。 よろしくお願いします。

  • 32ビットの浮動小数点について

    32ビットの浮動小数点(符号1ビット指数8ビット仮数23ビット)で非正規表現をもとめるには例えば(符号0指数0仮数1.01101)はどういう計算をすれば良いのでしょうか?

専門家に質問してみよう