<質問>小数バージョンでちょっと・・・・No.04183
いちもんじ さん 99/10/08 10:32
 
秀まるお様

message "tan( 3.14159・・・ ) = " + str( dllfunc( "Tan", 3.14159265358979 ) );
message "tan( 3.14159・・・ / 2 ) = " + str( dllfunc( "Tan", 3.1415926535897
9 / 2 ) );

   極端に小さい(あるいは大きい)数字になりますが,
    tan(Pai)=0,tan(Pai/2)=∞ になって欲しいです。

BASICなんかで
 y=x^a(xのa乗 aは小数でも) というのが出来ますけど,小数バージョンではで
きますか?

 この計算が出来ないと,ちょっと辛いんですが。

 

[ ]
RE:04183 <質問>小数バージョンでちょっとNo.04188
秀まるお さん 99/10/08 17:58
 
>message "tan( 3.14159・・・ ) = " + str( dllfunc( "Tan", 3.14159265358979 ) );
>message "tan( 3.14159・・・ / 2 ) = " + str( dllfunc( "Tan", 3.141592653589
>79 / 2 ) );
>
>   極端に小さい(あるいは大きい)数字になりますが,
>    tan(Pai)=0,tan(Pai/2)=∞ になって欲しいです。

 たぶん、C言語のライブラリがそういう作りになっているので、直らないと思いま
す。

 しいて対応するなら、今は8バイトの浮動小数点数でやってますけど、それを10
バイトの浮動小数点数で計算するようにするという手があります。

 C言語で言うと、double型は8バイト、long double型は10バイトです。

 ちなみにPentium系CPUの浮動小数点数レジスタは10バイトなので、10バイトに
すれば正確な演算が出来るのでしょう。

>BASICなんかで
> y=x^a(xのa乗 aは小数でも)

 すみません。Windowsの電卓を見てサポートしないといけないと思いつつ、忘れて
ました。

 んではもう一回バージョンアップすることにします。

 たぶん、pow( x, y )という形の関数になると思います。


[ ]
RE:04188 <質問>小数バージョンでちょっとNo.04190
番頭++ さん 99/10/08 18:42
 
> ちなみにPentium系CPUの浮動小数点数レジスタは10バイトなので、
>10バイトにすれば正確な演算が出来るのでしょう。

計算機は計算しているだけなので tan を変えない限りできません。
値が、より小さく小さくなるか、より大きく大きくなるか、だけです。
不連続ですから ==> 0 、==> ∞ は特殊な関数にしないとだめなんです。
プログラマが if で比較するのが普通ではないでしょうか ???

[ ]
RE:04190 <質問ョンでちょっと・・・・No.04192
きいろいまふらあ さん 99/10/08 20:20
 
きいろいまふらあです。

番頭+ + wrote on Fri, 08 Oct 1999 18:42:07 +0900
> 不連続ですから ==> 0 、==> ∞ は特殊な関数にしないとだめなんです。

それ以前に∞って浮動小数点で表現できるんですか?とかいって。(^^;
それ以前にtan(Pi/2) = ∞ってのが怪しい。とかいって。(^^;;
左から攻めると極値は∞だけど、右から攻めたら???(^^;;;
↑これさえも我ながら怪しいですけど。(爆)

数学の教科書なくしました。

----
高木 郷
e-mail:xxxx@pluto.dti.ne.jp

[ ]
RE:04183 <質問>小数バージョンでちょっとNo.04193
Arimac さん 99/10/08 23:19
 
>BASICなんかで
> y=x^a(xのa乗 aは小数でも) というのが出来ますけど,小数バージョンではで
>きますか?
>
> この計算が出来ないと,ちょっと辛いんですが。

数学的には

 y=exp(log(x) * a)

で出来るはずですが(^^;

[ ]
RE:04192 <質問ョンでちょっと・・・・No.04196
杉浦 まさき さん 99/10/09 00:07
 
番頭++ さん、こんばんは&
まふさん、お久しぶりです。
杉浦 です。

>> 不連続ですから ==> 0 、==> ∞ は特殊な関数にしないとだめなんです。
>それ以前に∞って浮動小数点で表現できるんですか?とかいって。(^^;

NaN とか INF を返しているわけじゃないんでしょうか??>hidemath.dll
#もし返しているなら、返された数値が NaN または INF かどうかを
 比較する関数(または比較演算子)がいるんじゃないでしょうか??


>それ以前にtan(Pi/2) = ∞ってのが怪しい。とかいって。(^^;;
>左から攻めると極値は∞だけど、右から攻めたら???(^^;;;
>↑これさえも我ながら怪しいですけど。(爆)

左極限は ∞、右極限は -∞ です、確かに(^^;。

[ ]
RE:04196 <質問ョンでちょっと・・・・No.04197
杉浦 まさき さん 99/10/09 00:30
 
ども、再び 杉浦 です。

>NaN とか INF を返しているわけじゃないんでしょうか??>hidemath.dll

んなアホな…と思ってVC6のヘルプ(MSDNライブラリ)を
見てみたら、以下の項目を発見しました。
何か思いっきり関係あるような気がしますけど(^^;。

PRB: tan(pi/2) Returns Value, Causes No Error
Last reviewed: July 25, 1997
Article ID: Q11158  
The information in this article applies to:
The C Run-time (CRT), included with:
 - Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, 6.0ax
 - Microsoft C for OS/2, versions 5.1, 6.0, 6.0a
 - Microsoft C/C++ for MS-DOS, version 7.0
 - Microsoft Visual C++ for Windows, versions 1.0, 1.5
 - Microsoft Visual C++ 32-bit Edition, versions 1.0, 2.0, 4.0, 5.0
 
#VC6.0は入っていないようですが…??


[ ]
RE:04197 <質問ョンでちょっと・・・・No.04201
番頭++ さん 99/10/09 13:42
 
きいろいまふらあさん、杉浦 まさきさん、お昼です。

>数学の教科書なくしました。
それより、記憶を無くすほうが、普通でしょう ...

>#もし返しているなら、返された数値が NaN または INF かどうかを
> 比較する関数(または比較演算子)がいるんじゃないでしょうか??
小さな小さな、大きな大きな、値が返るんです。

>PRB: tan(pi/2) Returns Value, Causes No Error
>Last reviewed: July 25, 1997
>Article ID: Q11158  
そうですか、でも今回は pi を数値で指定していますからね。
でも、よく見つけますよね。

誤差は、関数に依存します。タンタン狸の tan さんは、

    newfile;
    loaddll hidemarudir + "\\hidemath.dll";
    if( !result ) {
        message "hidemath.dllのロードに失敗しました。";
    }
    #p1 = 3.14159265358979;
    #p2 = 3.14159265358979323846;
    #p3 = 3.141592653589799;
    insert "tan( #p1 = 3.14159265358979       / 1 ) = " + str( dllfunc( "Tan
", ( #p1 / 1 ) ) ) + "\n";
    insert "tan( #p1 = 3.14159265358979323846 / 1 ) = " + str( dllfunc( "Tan
", ( #p2 / 1 ) ) ) + "\n";
    insert "tan( #p1 = 3.141592653589799      / 1 ) = " + str( dllfunc( "Tan
", ( #p3 / 1 ) ) ) + "\n";
    insert "tan( #p1 = 3.14159265358979       / 2 ) = " + str( dllfunc( "Tan
", ( #p1 / 2 ) ) ) + "\n";
    insert "tan( #p1 = 3.14159265358979323846 / 2 ) = " + str( dllfunc( "Tan
", ( #p2 / 2 ) ) ) + "\n";
    insert "tan( #p1 = 3.141592653589799      / 2 ) = " + str( dllfunc( "Tan
", ( #p3 / 2 ) ) ) + "\n";
    freedll;
endmacro;

tan( #p1 = 3.14159265358979       / 1 ) = -3.23109E-015
tan( #p1 = 3.14159265358979323846 / 1 ) = -1.22461E-016
tan( #p1 = 3.141592653589799      / 1 ) = 5.6507E-015
tan( #p1 = 3.14159265358979       / 2 ) = 6.18987E+014
tan( #p1 = 3.14159265358979323846 / 2 ) = 1.63318E+016
tan( #p1 = 3.141592653589799      / 2 ) = -3.53939E+014

マージャンでも「あんぜんπ」は無くは無いですが、アリ & アリです。
提供される C の関数、
まるおさん作 hidemath、
マクロを書く人 の誰かが誤差を埋める必要があります。ケモノ vs ツチ です。
昔、むかし、fortran のコンパイラを作成している人に聞きました、
「うちのコンパイラは東代のランタイムが無いと普通のコンパイラなんだよね」
だって、記憶があります 。。。東代 ??? あちきはカナ代です ...

[ ]
RE:04190 <質問>小数バージョンでちょっとNo.04203
秀まるお さん 99/10/09 18:00
 
 調べてみたら、そもそもC言語の技術計算関係の関数がdoubleで値を返すので、lo
ng doubleにしても結果は同じでした。(自分でアセンブリコードを書けば別ですが)

>不連続ですから ==> 0 、==> ∞ は特殊な関数にしないとだめなんです。
>プログラマが if で比較するのが普通ではないでしょうか ???

 たしかにそのようにマクロ作者側で適当に判定してもらうのが適当みたいです。

 ∞かどうかは、if( #a > 1000000000000000 ) みたいに判定してもらうのがいいか
と思います。


[ ]
RE:04203 <質問>小数バージョンでちょっとNo.04204
番頭++ さん 99/10/10 13:53
 
こんな感じです。

//*5    f1.mac - 1999/10/10 - K.N.
    loaddll hidemarudir + "\\hidemath.dll"; //  「秀丸」のディレクトリ
    if( !result ) {
        message "hidemath.dllのロードに失敗しました。";
    }
    #PI = 3.141592653589793238; //  π
    #result = 1;
    while( #result ){
//D     message "D-1";
        $msg1 = "TAN 三角関数のテスト - 角度を入力して下さい ?";
        //  89.999999999
        //  00.000000001
        if( $wk2 != "" ){
            $msg1 = $msg1 + "\n\n" + $wk2 + " ==> " + $wk1;
        }
        $wk2 = input($msg1,$wk2);
        #result = result;
    //T if( ( #result ) && $wk2 != "" && $wk2 == str(val($wk2)) ){
        if( ( #result ) && $wk2 != "" ){
        } else {
            #result = false;
        //?     break;  //  ではダメ !
        //?     [マクロエラー:秀丸で内部エラー発生] となる !
                goto pp_exit2;  //  これで逃げる !
        }
//D     message "D-2";
        if( #result ){
            #j = val($wk2) * #PI / 180; //  これでいいのかな ???
            $wk1 = "";
            #i = dllfunc( "Tan", #j );
            if( #i > 1E+10 ){
                $wk1 = "+∞ :  "  + str(#i);
            } else if( #i > 0 && #i < 1E-10 ){
                $wk1 = "+零 :  "  + str(#i);
            } else if( #i == 0 ){
                $wk1 = "零 :  "  + str(#i);
            } else if( #i < 0 && #i > -1E-10 ){ //  < 勘違い ???
                $wk1 = "-零 :  "  + str(#i);
            } else if( #i < 0 && #i < -1E+10 ){
                $wk1 = "-∞ :  "  + str(#i);
            } else {
                $wk1 = str(#i);
            }
    //T     message $wk1;
        }
//D     message "D-3";
    }
pp_exit2:
    freedll;
endmacro;


[ ]
RE:04193 <質問ョンでちょっと・・・・No.04211
いちもんじ さん 99/10/12 09:19
 
>>BASICなんかで
>> y=x^a(xのa乗 aは小数でも) というのが出来ますけど,小数バージョンではで
>>きますか?
>>
>> この計算が出来ないと,ちょっと辛いんですが。
>
>数学的には
>
> y=exp(log(x) * a)
>
>で出来るはずですが(^^;

 なるほど!そう言う手があったか。ふむふむ。

 でもちょっと待てよ。
 いちいちこんな式に変形するのは面倒だな。
 道具(マクロ)は便利で手軽な方がいいな。

[ ]
RE:04211 <質問ョンでちょっと・・・・No.04212
秀まるお さん 99/10/12 10:29
 
> 道具(マクロ)は便利で手軽な方がいいな。

 はい、少々お待ちを(っと言いつつ他の仕事をしている)


[ ]
RE:04212 <質問ョンでちょっと・・・・No.04214
秀まるお さん 99/10/12 12:47
 
 先ほど、HideMath.dllの3回目をアップしました。

 Pow関数だけ追加しています。

[ ]
RE:04214 <質問ョンでちょっと・・・・No.04216
いちもんじ さん 99/10/12 13:34
 
> 先ほど、HideMath.dllの3回目をアップしました。
>
> Pow関数だけ追加しています。

秀まるお様
早速,ダウンロードしてテストしました。

#a = dllfunc( "Pow", 2, 3 );
message "べき乗 2^3 = "+str(#a);    //べき乗

#a = dllfunc( "Pow", 2, 1/3 );
message "べき乗 2^(1/3) = "+str(#a);    //べき乗

#a = dllfunc( "Pow", 2, -0.234 );
message "べき乗 2^(-0.234) = "+str(#a);    //べき乗

ちゃんと 計算できました!!!

リファレンスマニュアル(ヘルプファイル)が欲しいですね。
外部ヘルプファイルでも良いです。

[ ]
RE:04216 <質問ョンでちょっと・・・・No.04236
秀まるお さん 99/10/13 17:33
 
>リファレンスマニュアル(ヘルプファイル)が欲しいですね。
>外部ヘルプファイルでも良いです。

 一応、付属のHideMath.txtが説明ファイルになってまして、それ以外の物は無いで
すが、…。多少手抜きしてます。


[ ]