- - PR -
時間を表示/バグについて
«前のページへ
1|2|3
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2002-07-29 23:00
1桁しかあてにならないというのには大いに反論ありです。
0.65 から 0.7499....までを0.7に丸めた結果の0.7であれば確かに有効桁数は1桁しかありませんが IEEE 754 では数値リテラルは15桁の有効数字を持ちます。 コンパイラ/言語がこの精度を保証しないことはないと思います。 もちろん剰余算により有効桁数は半減することがありますし、演算後の丸め次第では1ビットも有効桁が無くなる可能性もあります。 有効数字、有効桁数以前に、これは小数点下の数を2進数でどう表現しているかを知っているかだと思うのですが。 0.7 は2進では正確に表現できません。 0.5 0.25 0.125 0.0625 0.03125 ... の足し算の形で表現できるもの 正確には 2^-n (nは小数点下の表現に使われるビット数)の和の形で表現できなければなりません。 よって、その計算は2進数をベースに演算している限り正しい結果は得られないというのが結論になります。 正確に表現できないものをどう扱うかについては、言語仕様によって定義されます。 120.0000....0001 になる場合、0.7を0.7より微妙に小さい数として表現しているという事ですし、119.9999999....99999 になる場合、0.7を0.7より微妙に大きい数として表現しているわけです。 javaとjavacの関係が出てきましたが、この問題はjavaには無関係でjavacが0.7をどちらとして表現するかの問題です、Cの様に言語仕様によって処理系依存となっているのであれば、gccやその他のコンパイラ次第だといえます。 [ メッセージ編集済み 編集者: ふうすけ 編集日時 2002-07-29 23:02 ] | ||||
|
投稿日時: 2002-07-31 09:36
ふうすけさん、私が言ってる事と少しかみ合って無いですよ。 (もし0.7の有効数字が1桁であれば、いくらコンピュータ上のIEEEで15桁保証しようが、実際に有効な数字は1桁です。) 私が言っているのは、ドメイン領域での問題です。 いわば、設計上の問題と言っても良いかも知れません。! コンピュータ上のJava等の言語でモデル化し、処理する以前に、そのデータに対する、ドメインでの精度と処理を正確に理解する必要があるということです。 | ||||
|
投稿日時: 2002-08-03 12:41
盛りあがってる割に誰も質問に答えてないので・・・ 必要なのはコレでしょうか? http://java.sun.com/j2se/1.3/ja/docs/ja/relnotes/features.html#lang | ||||
|
投稿日時: 2002-08-05 03:33
ad hocさん書き込みありがとうございます。
実は困っていたんですよ。バグについてはどんな本にでも書いてあるただの2進数の説明になってしまって。結論としてはasipさんの「コンパイラによる違い」でよかったのですが。 「時間を表示」の件は質問の仕方が悪かったにもかかわらず返信してくださったad hocさんありがとうございます。これについては自力で解決しましたので大丈夫です。 コードとしては・・・ class TimerThread extends Thread { Component com; public TimerThread(Component com){ this.com=com; } public void run() { while(true){ try { com.repaint(); sleep(10000); } catch(InterruptedException e){} } } } class TimerCanvas extends Canvas{ TimerThread timer; public TimerCanvas(){ timer = new TimerThread(this); timer.start(); } public void paint(Graphics g){ String smin; Calendar calend = Calendar.getInstance(); int month = calend.get(Calendar.MONTH); int day = calend.get(Calendar.DATE); int hour = calend.get(Calendar.HOUR_OF_DAY); int min = calend.get(Calendar.MINUTE); if(min < 10){ smin = "0" + String.valueOf(min); } else{ smin = String.valueOf(min); } g.drawString(String.valueOf(month + 1) + "/" + String.valueOf(day) + " " + String.valueOf(hour) + ":" + smin,10,35); } } こんなクラスを作成してPanelに貼り付けました。 [ メッセージ編集済み 編集者: jack 編集日時 2002-08-05 03:37 ] | ||||
«前のページへ
1|2|3
