tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル科学技術計算式の表示
記事No16231
投稿日: 2016/04/14(Thu) 09:48
投稿者計さん
■VBのバージョン : Visual Basic 6.0
■OS           :Win7

初めて質問させていただきます。
当方は、現在製品加工工場内でシステム開発を行っているものです。
現場の要望として依頼のあった開発でわからないことがあるので投稿させて
いただきました。
まず、下記のような計算式があったとします。
計算式:
 (((((0.281397047049681 * 100000000000000000000000) / 338.07) * 0.000000025) / (30 ^ 2 * 200000)) / 9197.9)
この式の答えが
 1.25687394108575
となります。
この表記を
 1.26E-23
と表示させたいのですが、どうしたら出来るのでしょうか?
当方、情報処理の開発の経験は10年以上あるのですが
科学技術算術は全く経験がなく手段が思いつかず困っています。
どなたかご教授いただけると幸いです。
よろしくお願いします。

[ツリー表示へ]
タイトルRe: 科学技術計算式の表示
記事No16232
投稿日: 2016/04/14(Thu) 10:27
投稿者魔界の仮面弁士
> この式の答えが
>  1.25687394108575
> となります。
> この表記を
>  1.26E-23
> と表示させたいのですが、どうしたら出来るのでしょうか?

えぇと、それはどういう意味でしょうか?

1.26E-23 というのは、0.0000000000000000000000126 を意味しますよね。
1.25687394108575 と比べても、近似値にすらならないと思うのですが…。


なお、有効桁数 3 桁の指数表記にしたい、という意味であれば、

Dim answer As Double
answer = CDbl("1.25687394108575")

Dim result As String
result = Format(answer, "0.00E+0")

で行えます。この場合の出力は「1.26E+0」です。



>  (((((0.281397047049681 * 100000000000000000000000) / 338.07) * 0.000000025) / (30 ^ 2 * 200000)) / 9197.9)
>  1.26E-23
> と表示させたいのですが、どうしたら出来るのでしょうか?

出力結果を、有効桁数 3 桁にしたいとのことですが、
計算処理は、有効桁数何桁で行いたいのでしょうか。


VB6 のデータ型でそのまま計算させると、
 1.25687394108575 … Double 型の場合。10進数での有効桁数は約15.4桁。
 1.256873941085750937532290576 … Decimal 型の場合。有効桁数は約28.8桁。
程度の精度しか出せませんが、試しに、有効桁数 1000 桁で演算してみると、
下記の結果が得られました。

+1.25687 39410 85750 93753 22905 76054 78274 31473 16590 37191
   87645 54958 65680 21203 57204 95559 83213 84047 35242 60624
   43681 92269 90897 76886 68950 34235 96478 40567 74995 32864
   36427 17918 59142 99853 24985 70882 61748 43415 78726 33959
   32758 20392 93181 95292 11418 26560 76972 48566 94898 95543
   95252 45595 80159 49514 77874 46768 74369 42609 14187 62582
   47664 00567 00267 73407 82070 32689 90163 82417 90090 25740
   14465 48279 15252 72076 93947 49359 68271 04222 52878 06916
   75330 34677 89144 46361 05206 63860 15980 16760 27290 42483
   11614 59331 77639 76046 52099 08840 74853 81326 14344 24089
   68959 86922 10666 50056 50392 64206 87226 13642 76280 95614
   66260 40288 40115 53011 06886 87586 89658 68287 06240 68169
   13972 33054 62489 92415 62778 70912 68536 53830 47417 40460
   79608 35646 56602 69562 36498 66918 93074 22366 19376 01984
   94064 64542 52975 28759 15307 85957 70352 65010 91941 35695
   58787 31241 32444 84682 06993 24026 13033 33388 30083 98536
   20774 39623 82435 22246 87900 31717 76274 26784 55347 77082
   35065 06019 06540 15434 03947 83685 40424 32103 67998 28650
   51239 66665 66858 57279 25242 09521 28204 05582 91108 48889
   40218 76573 84478 66849 37241 08874 82033 09460 05347 8094


まぁ、今回はそこまでの精度は必要ないと思いますが、VB6 で高精度の桁数を
行いたいのであれば、下記の記事が参考になるかと思います。

http://salvw.miscnotes.com/index.php/archives/49
http://salvw.miscnotes.com/index.php/archives/53

[ツリー表示へ]
タイトルRe^2: 科学技術計算式の表示
記事No16233
投稿日: 2016/04/19(Tue) 08:59
投稿者計さん
魔界の仮面弁士様、返信が遅くなってしまって申し訳ありません。
あの後、関係各位と打ち合わせをしていたので遅くなりました。
ご相談の件ですが、一応の解決はいたしました。
現場の人間とさらに打ち合わせをして、どうやら現場として
得たい結果は、べき乗の数が知りたかったようです。
表記のルールとしては、
 1.計算結果によって『〇.〇〇E-〇〇』と表記する。
 2.計算結果によって『E』より後の数値が変動する。
    例:
     計算結果が『0.〜』の場合、『E』より後ろの数は『24』
     計算結果が『1.〜』の場合、『E』より後ろの数は『23』
 3.計算結果が『0.〜』だった場合、1つ桁上げをして表記する。
です。例えば、計算結果が
『1.25687394108575』だった場合、『-』から後の数値は『23』で
表記としては『1.26E-23』となり
計算結果が
『0.8704533855091751』だった場合、『-』から後の数値は『24』で
表記としては『8.70E-23』となります。
現場では、このような表記で計算結果の数値を扱っているようなので
処理としては、IF文で計算結果が『0.〜』なのか『1.〜』なのかを
判定して無理やり『〇.〇〇E-〇〇』の形に編集して出力するように
しました。
現場サイドにも見せ、テストしてもらったところOKをいただいたので
これで実装することになりました。
このような表記方法が正式にあるのかどうか、このような表記方法が
何という表記方法なのかわかりませんが、現場サイドの要望では
OKなようなのでこれでいこうと思います。
アドバイスいただきありがとうございました。

[ツリー表示へ]
タイトルRe^3: 科学技術計算式の表示
記事No16234
投稿日: 2016/04/19(Tue) 22:45
投稿者魔界の仮面弁士
>     例:
>      計算結果が『0.〜』の場合、『E』より後ろの数は『24』
>      計算結果が『1.〜』の場合、『E』より後ろの数は『23』

やはり「指数表記」のようですね。
指数表記では、仮数部を 1 ≦ m < 10 の範囲に「正規化」するのが一般的ですし。
(ちなみに E は exponent の意味です)


> 得たい結果は、べき乗の数が知りたかったようです。

最初の式で、「100000000000000000000000」をかけていますよね。
これは指数表記で 1.00E+23 という値を意味します。

計算時には、1.0E+23 倍して整数部を大きくしてから計算し、
表示時には、1.0E+23 で割った値を表示するということでしょう。


仮に 100000000000000000000000 倍しておかなかった場合、先の計算式は
 0.0000000000000000000000125687394108575093753229057605478274314731659037191…
という値になります。この値は確かに先方が求める
 1.26E-23
 1.25687394108575E-23
といった表記と同じ値になりますよね。




> IF文で計算結果が『0.〜』なのか『1.〜』なのかを
2 以上になることは無いのですね?


> アドバイスいただきありがとうございました。
以下、参考までに:

Dim a As Double, b As Double

a = CDbl("12345678901234600000000")
b = CDbl("12345678901234567890123")

'下記はいずれも
'「 1.23456789012346E+22       12345678901234600000000.00000000」
'という同じ出力になるため、一見すると違いがわかりません
Debug.Print a, Format(a, "0.00000000")
Debug.Print b, Format(b, "0.00000000")


'しかし下記は「True」となるので、
'a の方が大きな値を保持していることがわかります
Debug.Print a > b

'両者の差異を求めてみると
'本来は「32109877」となりそうではありますが
'実際は「31457280」という値が返されてきます
Debug.Print a - b

[ツリー表示へ]
タイトルRe^4: 科学技術計算式の表示
記事No16235
投稿日: 2016/04/20(Wed) 10:02
投稿者計さん
魔界の仮面弁士様、返信ありがとうございます。
さらに詳しい説明までいただき大変助かります。

> >     例:
> >      計算結果が『0.〜』の場合、『E』より後ろの数は『24』
> >      計算結果が『1.〜』の場合、『E』より後ろの数は『23』
>
> やはり「指数表記」のようですね。
> 指数表記では、仮数部を 1 ≦ m < 10 の範囲に「正規化」するのが一般的ですし。
> (ちなみに E は exponent の意味です)
やはり『指数表記』なんですね。そちらの方面の造詣は深くないのでほとんどわかりません。

>
>
> > 得たい結果は、べき乗の数が知りたかったようです。
>
> 最初の式で、「100000000000000000000000」をかけていますよね。
> これは指数表記で 1.00E+23 という値を意味します。
>
> 計算時には、1.0E+23 倍して整数部を大きくしてから計算し、
> 表示時には、1.0E+23 で割った値を表示するということでしょう。
>
>
> 仮に 100000000000000000000000 倍しておかなかった場合、先の計算式は
>  0.0000000000000000000000125687394108575093753229057605478274314731659037191…
> という値になります。この値は確かに先方が求める
>  1.26E-23
>  1.25687394108575E-23
> といった表記と同じ値になりますよね。
なるほど、そういうことだったんですね。そうすると最初の計算式
(((((0.281397047049681 * 100000000000000000000000) / 338.07) * 0.000000025) / (30 ^ 2 * 200000)) / 9197.9)
で『100000000000000000000000』を掛けずに出た計算結果を『Double』かなんかで宣言された
変数に格納して、それを表示させたら『〇.〇〇E-23』みたいな表記にできたかもしれないということ
なんでしょうか?
(あ、でも計算結果が小さすぎてその時点でオーバフローを起こすのかな?)

> > IF文で計算結果が『0.〜』なのか『1.〜』なのかを
> 2 以上になることは無いのですね?
一応、現場サイドに確認したところ『2.〜』になるような計算結果が出るような測定値だったら
その時点で不良品なのでロットアウトとなりこの処理を走らせることはない
ということでしたのでその点は大丈夫だと思います。

アドバイスありがとうございました。

[ツリー表示へ]