- PR -

時間を表示/バグについて

投稿者投稿内容
ふうすけ
常連さん
会議室デビュー日: 2002/02/21
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 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 ]
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2002-07-31 09:36
引用:

ふうすけさんの書き込み (2002-07-29 23:00) より:
 1桁しかあてにならないというのには大いに反論ありです。
 0.65 から 0.7499....までを0.7に丸めた結果の0.7であれば確かに有効桁数は1桁しかありませんが IEEE 754 では数値リテラルは15桁の有効数字を持ちます。
 コンパイラ/言語がこの精度を保証しないことはないと思います。


ふうすけさん、私が言ってる事と少しかみ合って無いですよ。
(もし0.7の有効数字が1桁であれば、いくらコンピュータ上のIEEEで15桁保証しようが、実際に有効な数字は1桁です。)

私が言っているのは、ドメイン領域での問題です。
いわば、設計上の問題と言っても良いかも知れません。!
コンピュータ上のJava等の言語でモデル化し、処理する以前に、そのデータに対する、ドメインでの精度と処理を正確に理解する必要があるということです。
ad hoc
会議室デビュー日: 2002/08/03
投稿数: 5
投稿日時: 2002-08-03 12:41
引用:

jackさんの書き込み (2002-07-24 04:26) より:
時間を取得して、それをJavaアプリケーションに動的なコンポーネントとして貼り付けるにはどうしたらよいのですか?様々な書籍やページを見ましたが、ただ時間を表示するだけのアプリケーションや、実行を開始したときの時間を表示するプログラムしかなくて困っています。


盛りあがってる割に誰も質問に答えてないので・・・

必要なのはコレでしょうか?
http://java.sun.com/j2se/1.3/ja/docs/ja/relnotes/features.html#lang
jack
常連さん
会議室デビュー日: 2002/07/24
投稿数: 22
投稿日時: 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 ]

スキルアップ/キャリアアップ(JOB@IT)