- PR -

[非 .net] VBAで機種依存文字のチェック

投稿者投稿内容
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-02-12 18:33
るぱんです。

以前これで気になって自分で調べてたんですけどね・・・。
1.小数点以下の数だけ*10で掛け算して加減乗除してDoubleに突っ込みなおしてから、
  Doubleで計算!

2.CStrでString型に突っ込みなおして四捨五入!(Round使えよ・・・。:自爆)

3.CDblで元に戻してから小数点に直す!

これでも無理か!?(汗
でも、出来たとして、入力のデータをかなり絞らないときつそうですよね。(笑)
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-13 09:25
はにまるです。

Clusterさんごめんさない。
スレッドと違う話題になってしまい...

引用:

ぢゃん♪さんより:
ぅわ、余計なこと言っちゃったかな…?
念のためですが、実数を扱う場合、結局どの型を使っても誤差との戦いは避けられませんので。
(たとえば 1÷3 なんて、浮動小数点だろうが2進化10進だろうが必ず誤差は出ます。)

#って、この例だと整数だろうが誤差が出るから意味ないか


ぢゃん♪さんの言われている内容は、
「システム利用者と仕様で決定する話」ではありませんか?

割算や掛算により端数をどうするかは、開発側で勝手に決める話ではありません。
仕様として明記し、端数処理結果は、開発者も設計者も利用者も検証する必要があります。

それに対し、企業文化により異なるかもしれませんが、
浮動小数等のコンピュータ固有の問題は、開発者、設計者で解決する問題です。

浮動小数変数を禁止した経緯を記述します。

「浮動小数変数型」は、科学技術用に決めれらたバイト数で広範囲の数字を扱う為に
考えられたデータ型です。ただ、構成上、確実な数値計算が出来ない恐れがあります。

よって、
業務アプリケーションでは、「浮動小数型」を利用する事自体が不適切であり、
小数を利用する場合は、「固定小数型」を使うべきと考えているからです。
# 特例はあるでしょうが、今の所、自分の経験では必要になった例はありません。

私が技術者として問題視したのは、
業務アプリケーションでは、「浮動小数型」を使うなという
基本的な教育をしていない
事に対してです。
# 無論、今いる会社のメンバーもしかりですが...

りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-13 10:15
こんにちわ。

えと、初心者の方などがここを見て勘違いされるといけないと思うので^^;

固定小数型を使っても誤差がなくなる訳ではありません。

「誤差を最小限に抑えることができる」だけです・・

ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-02-13 10:16
さらに話題がずれていく

引用:

はにまるさんの書き込み (2004-02-13 09:25) より:

私が技術者として問題視したのは、
業務アプリケーションでは、「浮動小数型」を使うなという
基本的な教育をしていない
事に対してです。


危険性を認識しながら使うのではなく、なんとなく使うから怖いんですよね、そういうのは。
浮動小数点の危険性は、「浮動小数点数の精度の低下」から「IEEE 浮動小数点表現」へと辿ると、出てくるんですけどね……ほとんどの人が見てないだろうけど……。
(↑これはC++ですが、どの言語も同じ。)

確かに誰かが教えないと、気にしてもらえないでしょうね……怖い怖い

#昔酷い目にあって(他人のコード保守でC言語のfloatに遭遇して)以来、実数型は大嫌いです
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2004-02-13 10:33
NAL-6295です。

固定小数点だから小数点以下の誤差が出ないというわけではなく、
VB6のCurrencyの実装がそうなっているだけですね。

どんな型だろうが、下位ビットは上位ビットの2分の1でしか無いので小数点以下は近似値表現
しか出来ません。
128,64,32,16,8,4,2,1,0.5,0.25,0.125,0.0625・・・・

#制御系とかだと小数点以下の計算に、多倍精度整数型を利用して小数点桁分、
#単位を大きくして処理してました。確かに実数型は使いませんね。
#あ、昔、業務系をC++で組んだとき、Doubleの誤差を吸収するクラスを再定義
#して使ってたな。
#と、話題を更にずらしてすいません。
omatsu
常連さん
会議室デビュー日: 2002/08/29
投稿数: 20
投稿日時: 2004-02-13 10:37
引用:

りばぁさんの書き込み (2004-02-13 10:15) より:

固定小数型を使っても誤差がなくなる訳ではありません。

「誤差を最小限に抑えることができる」だけです・・




その言い方も違うような気がしますけど...。
固定小数点と浮動小数点で、どっちが誤差が小さいかといったら(有効桁数が同じなら)浮動小数点の方じゃないですか?
十進固定小数点と二進浮動小数点とを比べた場合、十進固定小数点の方が、誤差の出方が、一般的な人間の予想に合致しているとは思いますけど。
りばぁ
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 130
お住まい・勤務地: 愛知県
投稿日時: 2004-02-13 10:47
引用:

omatsuさんの書き込み (2004-02-13 10:37) より:
固定小数点と浮動小数点で、どっちが誤差が小さいかといったら(有効桁数が同じなら)浮動小数点の方じゃないですか?
十進固定小数点と二進浮動小数点とを比べた場合、十進固定小数点の方が、誤差の出方が、一般的な人間の予想に合致しているとは思いますけど。



それは、演算の「精度」から見た場合ですよね。もちろん浮動小数点の方が
精度は高いです。
そもそも、精度が必要な場合に固定小数は使用しないと思います。

誤差と言っているのは、計算結果が開発者の意図している結果とどれだけ差があるか
と言うことかと。(うーん、うまい言い方が思いつかないです^^;)
はにまる
ぬし
会議室デビュー日: 2003/12/19
投稿数: 969
お住まい・勤務地: 誤字脱字の国
投稿日時: 2004-02-13 10:48
引用:

NAL-6295さんより:

固定小数点だから小数点以下の誤差が出ないというわけではなく、
VB6のCurrencyの実装がそうなっているだけですね。

どんな型だろうが、下位ビットは上位ビットの2分の1でしか無いので小数点以下は近似値表現
しか出来ません。
128,64,32,16,8,4,2,1,0.5,0.25,0.125,0.0625・・・・


話が食い違う理由が分かった気がする。

りばぁさん、NAL-6295さんの固定小数型は、
特定ビット以下、小数を表す形式の変数では無いですか?

私の言っている固定小数型は
内部は整数のみ、計算や利用時には10のべき乗計算をする形式の方です。

引用:

通貨型 (Currency) の変数は、64 ビット (8 バイト) の変数です。整数形式で表され、10,000 倍されて整数として記憶された、15 桁の整数部分と 4 桁の小数部分を持つ固定小数点数です。-



引用:

ぢゃん♪さんより:
危険性を認識しながら使うのではなく、なんとなく使うから怖いんですよね、そういうのは。
確かに誰かが教えないと、気にしてもらえないでしょうね……怖い怖い


そうですね。最低限、判っている範囲だけでも
後輩等に伝えて行かないと行けないですね。
「基礎知識の無い技術者は、短命になると」本に記述されていました。
# って自分もですが.. ^^;

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