
【事前予約】ダービースタリオンマスターズ
6: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:09:36.38 ID:qwBkuMha0.net
ほーん
コンピュータの人間超えはなさそうやね
10: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:10:44.69 ID:KocNo+8R0.net
>>6
プログラムやぞ?
13: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:11:20.65 ID:4puwb8GM0.net
>>6
はえーなんでコンピュータの話になるんやろか
7: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:10:04.26 ID:Hcl4umo/a.net
どうしてそうなるんや
12: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:10:58.50 ID:isek8peH0.net
>>7
0.1とかも0.1に近い近似であって0.1ではないから
16: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:12:29.77 ID:Jr7gFHjO0.net
>>12
丸が四角の塊みたいなもんか
21: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:13:48.26 ID:Hcl4umo/a.net
>>12
はえ〜なるほど
つまり現代のコンピューターの性質で、数値を2進数、つまり2の階乗の和で表現しようとするためです。
例えば0.5は簡単ですね。2-1です。また0.25は2-2ですから、0.75は2-1+2-2という事になります。
ちなみにJavaScriptで階乗を扱う場合はMath.pow()です。
1
console.log(Math.pow(2, -1)); // => 0.5
2
console.log(Math.pow(2, -2)); // => 0.25
3
console.log(Math.pow(2, -1) + Math.pow(2, -2)); // => 0.75
それでは0.1はどう表せば良いでしょうか?
1
console.log(0.1.toString(2)); // => "0.0001100110011001100110011001100110011001100110011001101"
おわかり頂けるでしょうか、これ、循環小数になります。10進数でいうところの1/3 = 0.33333333…みたいなやつです。
ですので、0.1は2進数の世界に生きるコンピューターでは正確に扱う事ができません。なので近似値で扱うのですが、実際の数値とはちょっとだけずれているので、計算を行うと変な結果になってしまったりするわけなんやな
24: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:14:18.05 ID:IDlvf2i2a.net
>>21
そのまま引用ニキ
26: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:15:29.19 ID:YMpwzU77d.net
>>21
草
14: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:11:21.77 ID:UDKA8MJF0.net
javascript:alert(0.1+0.2)
↑をコピーしてIEとかのアドレスバーに張り付けてエンター
17: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:12:40.60 ID:wZT9B7N90.net
浮動小数点演算について勉強するといいよ
19: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:13:19.28 ID:xIaCm6Vu0.net
javaとjavascriptは別人
20: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:13:45.02 ID:abJYhnPz0.net
2進数やとこうなるCOBOLは10進数やから銀行で使われる
25: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:14:24.08 ID:XGk7vlL60.net
2進数最大の弱点
29: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:17:09.30 ID:Hcl4umo/a.net
はえ〜COBOLって10進数なんや
昔見た教科書にはCOBOLは数字に強いから銀行に使われるくらいの説明しか書いてなかったけどその説明も欲しかったなあ
30: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:17:28.90 ID:TyPQIDIr0.net
全然知らんけどコンピュータに10進法使わせたら問題解決するんちゃうの?
32: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:18:57.55 ID:KocNo+8R0.net
>>30
そこはプログラマーの腕の見せどころ
31: 風吹けば名無し@\(^o^)/ 2016/09/27(火) 03:17:55.23 ID:abJYhnPz0.net
どうしても計算したいなら整数にしてから少数にするといお

【事前予約】全てのRPGファンへ贈る圧倒的クオリティ
おすすめ
引用元: http://tomcat.2ch.sc/test/read.cgi/livejupiter/1474913313/
1 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 09:53 ▼このコメントに返信 浮動小数演算だったらそのくらいの桁数なら数値比較しても大丈夫だと思うけど
2 名前 : (゚ω゚)投稿日:2016年09月28日 09:54 ▼このコメントに返信
ほーん
3 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 09:58 ▼このコメントに返信 ついさっき
4 > 125みたいなの打ったらtrue出てビビったわ
Number化してなくてテキストになってたのが原因だけどそれでも何故4>125がtrueなのか
4 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:04 ▼このコメントに返信 米3
テキスト扱いなら'4'と'1'比較したんじゃないの
5 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:05 ▼このコメントに返信 trimなりなんなり処理入れたらいいだけだろ…
プログラマーなら普通おまじない的にやってる
6 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:09 ▼このコメントに返信 >0.1は2進数の世界に生きるコンピューターでは正確に扱う事ができません。なので近似値で扱うのですが
これがそもそもの間違いだよね。
正確に扱えないなら扱えないでエラー吐くべきなのに無理しちゃう仕様にしたのがいけない。
7 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:12 ▼このコメントに返信 コンピュータ「だいたい合っているから無問題」
8 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:13 ▼このコメントに返信 ※3
辞書順だと先頭の文字から比較していくから
9 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:13 ▼このコメントに返信 ※6
こういう仕様なのは元々そんな厳密な演算を必要としてない演算では
そんな面倒な処理いれるより高速化・コンパクト化の方が重要だからだよ
厳密な演算が必要な場合はそれに適した処理を自分で作るなり、それ専用の型やライブラリを使うのが常識
10 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:21 ▼このコメントに返信 Javaの話なのかJavascriptの話なのか?それとも「Javasprict」という言語の話なのか?
そもそも、SEは「=0.1+0.2」などという代入文は書かないが(意味は注釈の中に封じ込める)。
11 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:21 ▼このコメントに返信 こんなもんコンピュータの話でもなんでもないだろ。
有効桁数を無視してる話でしかない。
デジタルの計算の実現方法の問題だと勝手に思い込んでるやつもいるが、
アナログの0.1ミリの表記がが0.1000000000まで保証したものでないことは小学校の算数で習うことだろ。
コンピュータ上でも0.0000001まで正確に入れてやれば計算結果も自動的に正確なものが出る。
12 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:25 ▼このコメントに返信 米11
無限小数を有限桁でしか処理できないコンピュータ特有の話だろ
13 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:26 ▼このコメントに返信 なるほど4 > 1になるのか
ありがとうお前ら
14 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:32 ▼このコメントに返信 >例えば0.5は簡単ですね。2-1です。
意味不明でコピー元見たら下記だったじゃねぇーか!
例えば0.5は簡単ですね。2^(-1)です。
15 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:32 ▼このコメントに返信 COBOLって偉大だったんや!
16 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:33 ▼このコメントに返信 ※12
有効桁数の話はアナログの世界でも同じことだぞ
精密な測定や設計に関わってると
その有効桁数を無視したり間違えたりしたために蓄積した誤差でトラブルになる話をいくらでも見れる
17 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:40 ▼このコメントに返信 米16
全然関係ない話でワロタ
有効桁数が何桁だろうがアナログじゃ0.1+0.2は0.3以外にはなり得んだろ
コンピュータは内部数値を2進数で持つから0.1を2進数変換すると無限小数になって
正確に10進法の0.1を保持できなくて計算結果に誤差が出るって話だよ
これは無視とか間違いとかそういう話じゃなくてコンピュータで小数を扱う以上避けられない話
18 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:46 ▼このコメントに返信 こまけぇこたぁいいんだよ
19 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:47 ▼このコメントに返信 チーターも3歩すすんで2歩さがるっていってるし
もう2進数は卒業しようぜ
20 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 10:52 ▼このコメントに返信 ※15
だから銀行さんがこぞって使ってるんやで
逆に我々の脳では複雑な計算ができないわけだし良し悪し
21 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:03 ▼このコメントに返信 ieee:ぽか〜ん
22 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:04 ▼このコメントに返信 米17
「0.1」とか「0.3」みたいな離散的な数の表現を「デジタル」って言うんやで。
「アナログ」ってのは連続的な、小数点以下が無限に続く数の取り扱い方のこと。
それにn進数における表現の限界には人間もコンピュータも関係ないから、言ってること全部的外れ。
23 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:09 ▼このコメントに返信 JavaScriptがしゃべった!
Javaもしゃべった!
こわい
24 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:26 ▼このコメントに返信 科学技術用でないなら、二進化十進表現で数値を格納して欲しい。
25 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:43 ▼このコメントに返信 スレ1の場合の誤差の原因を答えよ
A.アンダーフロー
B.丸め誤差
C.桁落ち
D.打切り誤差
E.情報欠落
基本情報で出るやで〜
26 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:46 ▼このコメントに返信 制御系や3Dの当たり判定とかを新人に任せると
大体、これが原因のバグを出すんだよなぁ・・・
27 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:46 ▼このコメントに返信 などと意味不明な供述をしており、定期
28 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:53 ▼このコメントに返信 ※25
これ…正確には選択肢に無い気がするんだけど
29 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 11:53 ▼このコメントに返信 どうせ「0.10.2」ってなるんだろ
と思ってた時期もありました(´∩ω∩`*)
30 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 12:06 ▼このコメントに返信 ※28
普通に丸め誤差だと思ったんだけど、なんで選択肢にないと思うの?
31 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 12:07 ▼このコメントに返信 >>21
口調くらいいじれやwww
32 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 12:25 ▼このコメントに返信 ※30
二つの値が浮動小数点による近似値による保持が原因じゃない?
スレ1の0.1+0.2の計算結果だと合わないなーって
丸めの誤差は元の値の何を丸めて計算した?だし
33 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 12:26 ▼このコメントに返信 >アナログじゃ0.1+0.2は 0.3以外にはなり得んだろ
かってに有効桁数きめるなよ
34 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 12:33 ▼このコメントに返信 ※32
>丸めの誤差は元の値の何を丸めて計算した?
0.1の2進数変換を丸めたんでしょ
35 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 12:53 ▼このコメントに返信 IEEE754で浮動小数点は規定されてるけどメモリの制限があった時代の産物なんだろう
補助記憶が潤沢に用意されてる今なら固定小数点で表す方が自然な気もするわ
COBOLだとこういう誤差はないんかな?
同じ問題があった時に小数点用のクラス作って問題を回避した記憶があるわ
36 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 13:10 ▼このコメントに返信 >>19を見て安心した
37 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 13:15 ▼このコメントに返信 JavascriptとJava言語は別物だからな
38 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 13:29 ▼このコメントに返信 でしまるニキ
39 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 13:32 ▼このコメントに返信 米35
使われる値の範囲が定義されていない限り固定小数点で計算はできない。
数値を表す先頭の数字からの有効桁数でどうしても制限がかかる。
メモリが無限にあれば回避できるが、計算コストも無限にかかることになる。
嘘だと思うなら自作の小数点用のクラスとやらで下の数値を計算してみよう。
・xの初期値を1とする。
・x=x+x/100を1000回繰り返す。
xは何桁の実数になった?
40 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 13:53 ▼このコメントに返信 ワイ機械オンチ
10進法にしちゃいかんの?
41 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 14:39 ▼このコメントに返信 用途に応じて色んなプログラミング言語があって、javascriptはそういうのを重視してない言語ってだけ。
適切な言語を使えばちゃんと0.1+0.2=0.3になる。
コンピューターは2進数だから0.1を正確に表現できないって言ってる奴は浮動小数点数覚えたてのにわか。
42 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 15:12 ▼このコメントに返信 正規化すれば正確に表せるんだっけ。
43 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 15:16 ▼このコメントに返信 ※17
何を言っているのかわからない。2進数だろうが10進数だろうが、そもそも整数型なら小数値は保持できないし、実数型なら、0.5は「5.0e-1」、12.34は「1234.0e-2」として問題なく保持できる。
実数型で問題が出るのは、仮数部の有効桁数以上の数値を扱おうとした場合ぐらい。仮数部とは「5.0e-1」の「5.0」の部分。(doubleで16桁(2^52)?)
0.1(1.0e-1)と0.00000000000000001(1.0e-17)は、それぞれの保持自体は問題がないが、このような桁が離れた数値同士の計算では問題が出やすい。
double型(仮数部52bit)だと、
0.00000000000000001は表現できても、
0.10000000000000001は表現できない。
44 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 15:17 ▼このコメントに返信 ※35
COBOLは10進数(2進化10進数:BCD)で計算を行うから誤差の出ようがない。
10進数の1234はBCDでは「0001 0010 0011 0100」として表現する。
COBOLならメモリの許す限り何桁だろうが表現可能。ただし計算に時間がかかる。
45 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 15:24 ▼このコメントに返信 sprictってなんや
46 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 16:37 ▼このコメントに返信 なにを今さら。
47 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 18:27 ▼このコメントに返信 ※1 小数点以下を2の何乗で整数になるのか判断しつつ作る気か?
48 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 18:43 ▼このコメントに返信 こんな基本なことで騒いでるとか
どこのど素人だよ
49 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 23:17 ▼このコメントに返信 小学生の時、安野光雅氏の絵本で十進化二進数って覚えたな
50 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 23:23 ▼このコメントに返信 ※49逆だ逆、二進化十進数だった、恥ずかしい
51 名前 : 暇つぶしの名無しさん投稿日:2016年09月28日 23:58 ▼このコメントに返信 最新の浮動小数では、10進数のが追加になっている。
binary16 半精度
binary32 単精度
binary64 倍精度
binary128 四倍精度
decimal32 十進単精度
decimal64 十進倍精度
decimal128 十進四倍精度
52 名前 : 暇つぶしの名無しさん投稿日:2016年09月29日 20:02 ▼このコメントに返信 定義の話がメインで
それにより丸め込みが出るって事だろ
10進数だから万能って訳でもない。
何進数であろうと循環小数は存在する
今回みたいな0.2と0.1なら十進数で解決できるだろうけど
三分の1を三回足すのは解決出来ない。
各桁を意識出来ないなら、何使ってもおなじだよ
53 名前 : 暇つぶしの名無しさん投稿日:2016年09月29日 20:03 ▼このコメントに返信 から
54 名前 : 暇つぶしの名無しさん投稿日:2016年09月30日 05:40 ▼このコメントに返信 まず、JavasprictではなくJavascriptだし、そもそもJavaとJavascriptは別物だし、階乗じゃなくて累乗(もしくは冪乗)だし。
55 名前 : 暇つぶしの名無しさん投稿日:2016年09月30日 07:20 ▼このコメントに返信 んで数字の扱いについては何が言いたい?
それらを訂正して語ってくれ
56 名前 : 暇つぶしの名無しさん投稿日:2016年10月04日 19:24 ▼このコメントに返信 >>30
コンピュータは結局0と1の世界だから2進数が一番効率的
効率と正確性のどちらを取るかという話
57 名前 : 暇つぶしの名無しさん投稿日:2016年10月28日 21:00 ▼このコメントに返信 米52
コンピュータの世界に小数値は存在しない。
ある数値を小数値として扱うというだけであって、やってることは整数計算。