特殊関数

 投稿者:しばっち  投稿日:2019年 7月 7日(日)16時07分22秒
  C/C++ライブラリーを使って十進BASICの2進モード、10進モードで利用できる関数を定義してみました。
#4384


boost ライブラリー
https://www.boost.org/
https://www.boost.org/doc/libs/1_70_0/libs/math/doc/html/special.html
vc++2012でコンパイル


ALGLIB ライブラリー free版
http://www.alglib.net/
http://www.alglib.net/specialfunctions/
vc++2012でコンパイル


GSL ライブラリー
https://www.gnu.org/software/gsl/
ダウンロードしたライブラリーがvc++2015ビルドだったため、vc++2015でコンパイル


標準 ライブラリー
https://cpprefjp.github.io/reference/cmath.html
規格がc++17であるためvc++2019にてコンパイル


十進BASICでネイティブ未対応の特殊関数を集めてみました。

AIRY関数
BESSEL関数
ベータ関数
ガンマ関数
誤差関数
指数積分
対数積分
ランベルト関数
ゼータ関数


https://ja.wikipedia.org/wiki/エアリー関数
https://ja.wikipedia.org/wiki/ベッセル関数
https://ja.wikipedia.org/wiki/ベータ関数
https://ja.wikipedia.org/wiki/ガンマ関数
https://ja.wikipedia.org/wiki/誤差関数
https://ja.wikipedia.org/wiki/対数積分
https://ja.wikipedia.org/wiki/指数積分
https://ja.wikipedia.org/wiki/ランベルトのW関数
https://ja.wikipedia.org/wiki/リーマンゼータ関数

また、複素数モードで利用できる関数もいくつか定義しています。


サンプル画像はガンマ関数 gamma(x)のグラフを描かせてみました。


basファイル129本及びソース、dllファイル合わせて258本と使用したライブラリーツール2種を
下記URLにアップしておきました。(specialfunction.zip)

https://3.gigafile.nu/0806-d0fd286114d874d9d0e3a37e88b2437e1

ダウンロードパスワード:設定していません
ぜひ、お試しください。

なお、URLの有効期限は2019年8月6日(火)までです。


cpp/cソースファイルはastyleで整形しました。
http://astyle.sourceforge.net/

dllファイルはupxにて圧縮済です。
https://upx.github.io/
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月10日(水)08時08分46秒
  > No.4673[元記事へ]

しばっちさんへのお返事です。

十進BASICのnative関数にはない、とても有用な関数だと思います。

> サンプル画像はガンマ関数 gamma(x)のグラフを描かせてみました。

その関数をBASメインプログラムからどの様に呼び出せば良いのかを知りたいのですが、上記グラフを描いたBASコードをご教示頂けないでしょうか?

 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月10日(水)20時57分41秒
  > No.4674[元記事へ]

島村1243さんへのお返事です。

> その関数をBASメインプログラムからどの様に呼び出せば良いのかを知りたいのですが、上記グラフを描いたBASコードをご教示頂けないでしょうか?


specialfunction.zipファイルをダウンロードしていただくとその中にGAMMADLL?.BASというファイルが5本入っており、そのいずれかを実行すればガンマ関数のグラフを
描くことができますが、Linux版、Mac版をご利用の方は実行できません。Windows版十進BASIC用です。(更に詳しくいうとSSE2 対応のアーキテクチャを持つCPUであること)
5本あるのは、使用しているライブラリーの違いで、定義されている関数に若干違いがあります。

もし、実行時にDLLフィルがロードできない、見つからない等のエラーが出る場合は、ZIPファイルを解凍して出来たDLLフォルダごとBASIC.EXEと同じフォルダに入れてください。
若しくは、ASSIGN文の相対パスを対象のDLLファイルへの絶対パスに書き換えてください。



Linux版、Mac版をご利用の方の為に、Libraryフォルダ内のPROBDIST.LIBにガンマ関数の定義がありましたので、
そちらを使用してグラフ描いてみました。

ガンマ関数の定義域は0より大きい時 X>0 と負数では整数値以外 FP(X)<>0 の場合で描画しています。

CALL GINIT(800,800)
SET WINDOW -5,5,-5,5
DRAW GRID(1,1)
SET LINE COLOR 2
FOR X=-5 TO 5 STEP 1/128
   IF FP(X)<>0 OR X>0 THEN
      LET Y=GAMMA(X)
      PLOT LINES:X,Y;
   ELSE
      PLOT LINES
   END IF
NEXT  X
PAUSE
CLEAR
SET WINDOW 0,5,-1,5
DRAW GRID(1,1)
SET LINE COLOR 3
FOR X=1/128 TO 5 STEP 1/128
   LET Y=GammaLib.LogGamma(X) ! 負数側が計算できない(X>0 のみ)
   PLOT LINES:X,Y;
NEXT  X
PAUSE
CLEAR
SET WINDOW -5,5,-5,5
DRAW GRID(1,1)
SET LINE COLOR 4
FOR X=-5 TO 5 STEP 1/128
   IF FP(X)<>0 OR X>0 THEN
      LET Y=1/GAMMA(X) ! 1/GAMMA(0)=1/GAMMA(-1)=1/GAMMA(-2)=ゼロ ???
      PLOT LINES:X,Y;
   ELSE
      PLOT LINES
   END IF
NEXT  X
PAUSE
CLEAR
SET WINDOW -1,6,-1,20
DRAW GRID(1,1)
FOR N=1 TO 6 STEP 1/4
   LET COL=COL+1
   SET LINE COLOR COL
   FOR K=0 TO N STEP 1/8
      PLOT LINES:K,BINOM(N,K);
   NEXT K
   PLOT LINES
NEXT N
END

MODULE GammaLib
PUBLIC FUNCTION LogGamma
SHARE NUMERIC LOG_2PI
SHARE NUMERIC N,B0,B1,B2,B4,B6,B8,B10,B12,B14,B16
LET LOG_2PI=1.83787706640934548  !/* $\LOG 2\pi$ */
LET N = 8
LET B0 = 1                 !/* 以下はBernoulli数 */
LET B1 = (-1.0 / 2.0)
LET B2 = ( 1.0 / 6.0)
LET B4 = (-1.0 / 30.0)
LET B6 = ( 1.0 / 42.0)
LET B8 = (-1.0 / 30.0)
LET B10 =( 5.0 / 66.0)
LET B12 =(-691.0 / 2730.0)
LET B14 =( 7.0 / 6.0)
LET B16 =(-3617.0 / 510.0)
EXTERNAL FUNCTION LogGamma(x)  !/* ガンマ関数の対数 */
   DECLARE NUMERIC v, w
   LET v = 1
   DO WHILE x < N
      LET v = v * x
      LET x = x+1
   LOOP
   LET w = 1 / (x * x)
   LET LogGamma=((((((((B16 / (16 * 15))  * w + (B14 / (14 * 13))) * w  &
&                    + (B12 / (12 * 11))) * w + (B10 / (10 *  9))) * w  &
&                    + (B8  / ( 8 *  7))) * w + (B6  / ( 6 *  5))) * w  &
&                    + (B4  / ( 4 *  3))) * w + (B2  / ( 2 *  1))) / x  &
&                    + 0.5 * LOG_2PI - LOG(v) - x + (x - 0.5) * LOG(x)
END FUNCTION
END MODULE

EXTERNAL FUNCTION Gamma(x)  !/* ガンマ関数 */
DECLARE EXTERNAL FUNCTION GammaLib.LogGamma
IF x < 0 THEN
   LET Gamma= PI / (SIN(PI * x) * EXP(LogGamma(1 - x)))
ELSE
   LET Gamma= EXP(LogGamma(x))
END IF
END FUNCTION

EXTERNAL FUNCTION Beta(x, y)  !/* ベータ関数 */
DECLARE EXTERNAL FUNCTION GammaLib.LogGamma
LET Beta= EXP(loggamma(x) + loggamma(y) - loggamma(x + y))
END FUNCTION

EXTERNAL  FUNCTION BINOM(N,K) !'二項係数 COMB(N,K)
LET BINOM=GAMMA(N+1)/GAMMA(N-K+1)/GAMMA(K+1)
END FUNCTION

!EXTERNAL  FUNCTION BINOM(N,K) !'二項係数 COMB(N,K)
!LET BINOM=1/(N+1)/BETA(N-K+1,K+1)
!END FUNCTION

EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,YSIZE-1,0
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
FOR I=0 TO 7
   SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
END SUB
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月12日(金)06時37分52秒
  しばっちさんへのお返事です。

> specialfunction.zipファイルをダウンロードしていただくとその中にGAMMADLL?.BASというファイルが5本入っており、そのいずれかを実行すればガンマ関数のグラフを
> 描くことができますが、Linux版、Mac版をご利用の方は実行できません。Windows版十進BASIC用です。(更に詳しくいうとSSE2 対応のアーキテクチャを持つCPUであること)
> 5本あるのは、使用しているライブラリーの違いで、定義されている関数に若干違いがあります。
>
> もし、実行時にDLLフィルがロードできない、見つからない等のエラーが出る場合は、ZIPファイルを解凍して出来たDLLフォルダごとBASIC.EXEと同じフォルダに入れてください。
> 若しくは、ASSIGN文の相対パスを対象のDLLファイルへの絶対パスに書き換えてください。

ご丁寧なご教示、有難うございました。
早速、倣って実行してみたいと思います。
 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月12日(金)20時36分1秒
  対数ガンマ(LogGamma)の負数側のグラフ描画に対応しました。
加えてディガンマ関数、ガンマ関数の微分のグラフも描画できるようになりました。


一番上の行に
DECLARE EXTERNAL FUNCTION GammaLib.LogGamma
を加えて

対数ガンマのグラフ描画部を下記と置き換えてください。ディガンマ関数(対数ガンマの微分)、ガンマ関数の微分のグラフ描画部も加えています。

SET WINDOW -5,5,-5,5
DRAW GRID(1,1)
SET LINE COLOR 3
FOR X=-5 TO 5 STEP 1/128
IF FP(X)<>0 OR X>0 THEN
LET Y=LogGamma(X)
PLOT LINES:X,Y;
ELSE
PLOT LINES
END IF
NEXT X
PAUSE
CLEAR
SET WINDOW -5,5,-5,5
DRAW GRID(1,1)
SET LINE COLOR 4
FOR X=-5 TO 5 STEP 1/128
IF FP(X)<>0 OR X>0 THEN
LET Y=DIGAMMA(X)
PLOT LINES:X,Y;
ELSE
PLOT LINES
END IF
NEXT X
PAUSE
CLEAR
SET WINDOW -5,5,-5,5
DRAW GRID(1,1)
SET LINE COLOR 5
FOR X=-5 TO 5 STEP 1/128
IF FP(X)<>0 OR X>0 THEN
LET Y=GAMMA(X)*DIGAMMA(X) !' ガンマ関数の微分
PLOT LINES:X,Y;
ELSE
PLOT LINES
END IF
NEXT X

そして、モジュールGammaLibを下記と修正してください。、
IF X < 0 THEN から END IFまでの4行(赤色)を加筆しています。
ディガンマ関数も付け足して下さい。


MODULE GammaLib
PUBLIC FUNCTION LogGamma
SHARE NUMERIC LOG_2PI
SHARE NUMERIC N,B0,B1,B2,B4,B6,B8,B10,B12,B14,B16
LET LOG_2PI=1.83787706640934548 !/* $\LOG 2\pi$ */
LET N = 8
LET B0 = 1 !/* 以下はBernoulli数 */
LET B1 = (-1.0 / 2.0)
LET B2 = ( 1.0 / 6.0)
LET B4 = (-1.0 / 30.0)
LET B6 = ( 1.0 / 42.0)
LET B8 = (-1.0 / 30.0)
LET B10 =( 5.0 / 66.0)
LET B12 =(-691.0 / 2730.0)
LET B14 =( 7.0 / 6.0)
LET B16 =(-3617.0 / 510.0)
EXTERNAL FUNCTION LogGamma(x) !/* ガンマ関数の対数 */
DECLARE NUMERIC v, w
IF X < 0 THEN
LET LogGamma=LOG(ABS(PI/SIN(PI*x)))-LogGamma(1-x)
EXIT FUNCTION
END IF

LET v = 1
DO WHILE x < N
LET v = v * x
LET x = x+1
LOOP
LET w = 1 / (x * x)
LET LogGamma=((((((((B16 / (16 * 15)) * w + (B14 / (14 * 13))) * w &
& + (B12 / (12 * 11))) * w + (B10 / (10 * 9))) * w &
& + (B8 / ( 8 * 7))) * w + (B6 / ( 6 * 5))) * w &
& + (B4 / ( 4 * 3))) * w + (B2 / ( 2 * 1))) / x &
& + 0.5 * LOG_2PI - LOG(v) - x + (x - 0.5) * LOG(x)
END FUNCTION
END MODULE

EXTERNAL FUNCTION DIGAMMA(X)
IF X<0 THEN
LET DIGAMMA=DIGAMMA(1-X)-PI/TAN(PI*X)
EXIT FUNCTION
END IF
LET EULER=0.577215664901532860606512
FOR N=0 TO 1000
LET S=S-(1/(X+N)-1/(N+1))
NEXT N
LET DIGAMMA=S-EULER
END FUNCTION
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月14日(日)17時35分31秒
  しばっち様へのお返事です。

> もし、実行時にDLLフィルがロードできない、見つからない等のエラーが出る場合は、ZIP
> ファイルを解凍して出来たDLLフォルダごとBASIC.EXEと同じフォルダに入れてください。

私は2004年頃のPCを使っているのですが、
OSがWindows2000(professional)SP4のPCで上記を行なっても「見つからない」とのメッセージが出ました。
OSがWindowsXPのPCでは、上記を行なって正常に動作(描画)しました。

この結果、Windows2000上のBASIC.exeでは特殊関数の利用は諦めないとダメの様でした。
以上、報告です。
 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月14日(日)19時26分45秒
  > No.4678[元記事へ]

島村1243さんへのお返事です。

> 私は2004年頃のPCを使っているのですが、
> OSがWindows2000(professional)SP4のPCで上記を行なっても「見つからない」とのメッセージが出ました。
> OSがWindowsXPのPCでは、上記を行なって正常に動作(描画)しました。
>
> この結果、Windows2000上のBASIC.exeでは特殊関数の利用は諦めないとダメの様でした。

cppソースのコンパイルにMicrosoft Visual C++ 2012,2015,2019を使用していますが、
コンパイルされたファイルの動作対応自体がどうやらWindows XP SP3以降のようです。

Microsoft Visual C++ 2012以前のコンパイラーを使用すれば動くようになるかも
しれませんが、コンパイラー自体が古くなるので、逆にコンパイラーが未対応で
エラーが出るかもしれません。

C/C++にも次々と新しい規格(最新はC++17)が出ているようです。

gccなどのコンパイラーが他にもまだありますが、それでもWindows2000に対応させていくのは
難しいかもしれません。

 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月15日(月)09時45分26秒
  しばっち様へのお返事です。

ご回答有難うございます。

> cppソースのコンパイルにMicrosoft Visual C++ 2012,2015,2019を使用していますが、
> コンパイルされたファイルの動作対応自体がどうやらWindows XP SP3以降のようです。

WindowsXP_HOME(SP3)上のBASIC(v7853).exeでGAMMADLL.BASは正常に動作したので、
その後、他のDLL.BASについても動作を確認したところ、皆
”.dllがロード出来ない”
とのメッセージが出ましたので、WindowsXP(SP3)では、GAMMADLL.BAS以外は動作しないようです。少なくともWindows7以上が必要なのかなと思いました(残念ながらこのOSは持っていない)。
 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月15日(月)20時57分13秒
  島村1243さんへのお返事です。

> WindowsXP_HOME(SP3)上のBASIC(v7853).exeでGAMMADLL.BASは正常に動作したので、
> その後、他のDLL.BASについても動作を確認したところ、皆
> ”.dllがロード出来ない”
> とのメッセージが出ましたので、WindowsXP(SP3)では、GAMMADLL.BAS以外は動作しないようです。少なくともWindows7以上が必要なのかなと思いました(残念ながらこのOSは持っていない)。

gslライブラリーによるものと標準ライブラリーの規格C++17によるものはvc++2010ではコンパイルできませんが、
それ以外のalglibライブラリーとboostライブラリーによる特殊関数についての93本ばかりをvc++2010にて再コンパイルしてみました。

もしかしたらこれでWindow XPでも動くかもしれません。以前ダウンロードしたdllフォルダの名前を他に変更(または移動)しておいて(上書きはせずに)
下記からダウンロードし解凍してできたdllフォルダに置き換えて、ぜひ実行してみてください。


ダウンロード期限:2019年8月14日(水) (dll.zip)

https://13.gigafile.nu/0814-cd37b2c7a060129e034374286734f41cc
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月16日(火)09時12分24秒
  しばっち様へのお返事です。

> gslライブラリーによるものと標準ライブラリーの規格C++17によるものはvc++2010ではコンパイルできませんが、
> それ以外のalglibライブラリーとboostライブラリーによる特殊関数についての93本ばかりをvc++2010にて再コンパイルしてみました。
>
> もしかしたらこれでWindow XPでも動くかもしれません。以前ダウンロードしたdllフォルダの名前を他に変更(または移動)しておいて(上書きはせずに)
> 下記からダウンロードし解凍してできたdllフォルダに置き換えて、ぜひ実行してみてください。

お手数のかかる再コンパイルをして頂き、WindowsXPを使う私にとって非常に有り難いです。
ご提供頂いた新dllを適用して全BASプログラムを走らせ、「どれが動作し、どれが動作しないか」の結果を、追ってご報告致しますので、しばらくお時間を頂きたく思います。
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月16日(火)21時30分10秒
  しばっち様へのお返事です。

> gslライブラリーによるものと標準ライブラリーの規格C++17によるものはvc++2010ではコンパイルできませんが、
> それ以外のalglibライブラリーとboostライブラリーによる特殊関数についての93本ばかりをvc++2010にて再コンパイルしてみました。
> もしかしたらこれでWindow XPでも動くかもしれません。
> 下記からダウンロードしdllフォルダに置き換えて、ぜひ実行してみてください。

WindowsXP(SP3)上のBASIC.exe(v7.8.5.3)に新dllを適用して動作確認した結果報告です。
(なお、Windows2000でも試しましたがWindows2000では全滅です。)

確認したBASプログラムの総数129個のうち
 ● dllがロードできないBASプログラムの総数36個
 ● dllをロードするが、演算途中でエラー停止するBASプログラム総数10個
  ● 正常に動作が完了するプログラム総数=129個ー36個ー10個=83個
でした。
dllがロード出来ない36個=129個ーしばっち様が再コンパイルした数93個
となり数が合うので、36個がdllをロード出来ない理由はしばっち様の説明のとおりだと思います。

なお不思議な事に、GAMMADLL.BASのみが前のdllで動作したのですが、確認試験ではGAMMADLL.BASは新dllをロード出来ませんでした。原因不明です。

(1)dllがロードできない36個のBASファイル名

 AIRYDLL3.BAS    BESSELDLL.BAS    BESSELDLL4.BAS
 BETADLL3.BAS       CLAUSENDLL.BAS  CLGAMMADLL.BAS
  COMPELLINTDLL.BAS  COMPLEXDLL.BAS   COULOMBDLL.BAS
 DAWSONDLL2.BAS     DEBYEDLL.BAS      DILOGDLL.BAS
 ELLINTDLL2.BAS     ERFDLL.BAS       ERFDLL4.BAS
 ERFZDLL.BAS        EXPINTDLL2.BAS    EXPINTDLL3.BAS
 FERMIDIRACDLL.BAS
 GAMMADLL.BAS <---これは前dllでは動作したが、新dllでは何故か不動作だった。
 GAMMADLL4.BAS     GEGENDLL.BAS      HYPERBOLICINTEGRALDLL.BAS
 HYPERGDLL.BAS     LAMBERTDLL.BAS    POCHDLL.BAS
 POLYGAMMADLL.BAS  POLYNOMIALSDLL2.BAS
 POLYNOMIALSDLL3.BAS
 POLYSOLVEDLL.BAS  SINCOSINTEGRALDLL.BAS
 SPHBESSELDLL.BAS  SYNCHROTRONDLL.BAS
 TRANSPORTDLL.BAS  ZETADLL2.BAS      ZETADLL3.BAS

(2)dllをロードするが、演算途中でエラー停止する10個のBASファイル名と
エラーメッセージと停止するコード

 AIRYDLL.BAS     エラー:EXTYPE -9900   LET Y=AIRY_AI(X)
  CGAMMADLL2.BAS  エラー:EXTYPE -9900   PRINT CGAMMA(X)
  ELLINTDDLL.BAS  エラー:EXTYPE -9900   LET Y=ELLINTD(X,PHI)
  HYPERBOLICSINCOSINTEGRALDLL.BAS  エラー:EXTYPE 1003 (停止コードは長いので略)
  IBETADLL.BAS    エラー:EXTYPE -9900   LET Y=P_T(N,X)
  JACOBIDLL.BAS   エラー:EXTYPE -9900   LET Y=JACOBIDS(U,X)
  POLYGAMMADLL2.BAS エラー:EXTYPE -9900 LET Y=POLYGAMMA(N,X)
  SINECOSINEINTEGRALSDLL.BAS  エラー:EXTYPE 1003 (停止コードは長いので略)
  SPHBESSELDLL2.BAS  エラー:EXTYPE -9900  LET Y=SPHBESSEL(N,X)
  TDISTDLL.BAS   エラー:EXTYPE -9900    LET Y=P_T(N,X)

以上です。
 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月17日(水)19時26分23秒
  > No.4683[元記事へ]

島村1243さんへのお返事です。

> 確認したBASプログラムの総数129個のうち
>  ● dllがロードできないBASプログラムの総数36個
>  ● dllをロードするが、演算途中でエラー停止するBASプログラム総数10個
>   ● 正常に動作が完了するプログラム総数=129個ー36個ー10個=83個
> でした。
> dllがロード出来ない36個=129個ーしばっち様が再コンパイルした数93個
> となり数が合うので、36個がdllをロード出来ない理由はしばっち様の説明のとおりだと思います。
>
> なお不思議な事に、GAMMADLL.BASのみが前のdllで動作したのですが、確認試験ではGAMMADLL.BASは新dllをロード出来ませんでした。原因不明です。

まず、GAMMADLL.BASが読み込むDLLファイルはgamma.dllで、これは標準ライブラリーのC++17(2017年に改訂された標準規格)を使用したものです。
VC++2010では対応していないのでコンパイルできない為 gamma.dllは入っていません。

> (2)dllをロードするが、演算途中でエラー停止する10個のBASファイル名と
> エラーメッセージと停止するコード
>
>  AIRYDLL.BAS     エラー:EXTYPE -9900   LET Y=AIRY_AI(X)
>   CGAMMADLL2.BAS  エラー:EXTYPE -9900   PRINT CGAMMA(X)
>   ELLINTDDLL.BAS  エラー:EXTYPE -9900   LET Y=ELLINTD(X,PHI)
>   HYPERBOLICSINCOSINTEGRALDLL.BAS  エラー:EXTYPE 1003 (停止コードは長いので略)
>   IBETADLL.BAS    エラー:EXTYPE -9900   LET Y=P_T(N,X)
>   JACOBIDLL.BAS   エラー:EXTYPE -9900   LET Y=JACOBIDS(U,X)
>   POLYGAMMADLL2.BAS エラー:EXTYPE -9900 LET Y=POLYGAMMA(N,X)
>   SINECOSINEINTEGRALSDLL.BAS  エラー:EXTYPE 1003 (停止コードは長いので略)
>   SPHBESSELDLL2.BAS  エラー:EXTYPE -9900  LET Y=SPHBESSEL(N,X)
>   TDISTDLL.BAS   エラー:EXTYPE -9900    LET Y=P_T(N,X)

どうやら定義域エラー(内部エラー)を起こしていたようです。
VC++2012とVC++2010のコンパイラーの違い?

FOR X=0 TO 1 STEP 1/128 ----> FOR X=1/128 TO 1-1/128 STEP 1/128
定義域に0と1は含まれない等(0<x<1 と 0<=x<=1 の違い)

BASソースの一部を修正したら EXTYPE -9900が出なくなりました。

また、私自身が関数群をよく知らず定義域を理解してなかった為
に起こったエラーの可能性も高いです。

大変失礼致しました。


> (1)dllがロードできない36個のBASファイル名
>
>  AIRYDLL3.BAS    BESSELDLL.BAS    BESSELDLL4.BAS
>  BETADLL3.BAS       CLAUSENDLL.BAS  CLGAMMADLL.BAS
>   COMPELLINTDLL.BAS  COMPLEXDLL.BAS   COULOMBDLL.BAS
>  DAWSONDLL2.BAS     DEBYEDLL.BAS      DILOGDLL.BAS
>  ELLINTDLL2.BAS     ERFDLL.BAS       ERFDLL4.BAS
>  ERFZDLL.BAS        EXPINTDLL2.BAS    EXPINTDLL3.BAS
>  FERMIDIRACDLL.BAS
>  GAMMADLL.BAS <---これは前dllでは動作したが、新dllでは何故か不動作だった。
>  GAMMADLL4.BAS     GEGENDLL.BAS      HYPERBOLICINTEGRALDLL.BAS
>  HYPERGDLL.BAS     LAMBERTDLL.BAS    POCHDLL.BAS
>  POLYGAMMADLL.BAS  POLYNOMIALSDLL2.BAS
>  POLYNOMIALSDLL3.BAS
>  POLYSOLVEDLL.BAS  SINCOSINTEGRALDLL.BAS
>  SPHBESSELDLL.BAS  SYNCHROTRONDLL.BAS
>  TRANSPORTDLL.BAS  ZETADLL2.BAS      ZETADLL3.BAS


dllがロードできなかった残りの36個のファイルのうちgslライブラリーを使用した28個のcppファイルのコンパイルにVC++2010で成功しました。
但し、バージョンがgsl 2.2からgsl 1.8にダウンしています。これによりexpint3.cpp内に定義されている
expint_en(指数積分)関数が未定義(エラー)のため使用できません。(EXPINTDLL3.BASから該当部分を外しています)
COMPLEXDLL.BAS(complex.dll)がうまく動かないようですが...gslのバージョンの違いのせいかもしれない。

また、実行時に別途libgsl.dllとlibgslcblas.dllが必要です。(BASIC.EXEと同じフォルダに入れてください)

下記URLにアップしておきました。(dll.zip)

https://33.gigafile.nu/0915-c90f4d86cdfd56816c8165b4e4c1c2c4b

ダウンロード期限:2019年9月15日(日)


ぜひ、こちらもお試しください。

 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月19日(金)09時16分27秒
  しばっち様へのお返事です。

> BASソースの一部を修正したら EXTYPE -9900が出なくなりました。
> ---中略---
> dllがロードできなかった残りの36個のファイルのうちgslライブラリーを使用した28個のcppファイルのコンパイルにVC++2010で成功しました。
> 但し、バージョンがgsl 2.2からgsl 1.8にダウンしています。これによりexpint3.cpp内に定義されている
> expint_en(指数積分)関数が未定義(エラー)のため使用できません。(EXPINTDLL3.BASから該当部分を外しています)
> COMPLEXDLL.BAS(complex.dll)がうまく動かないようですが...gslのバージョンの違いのせいかもしれない。
>
> また、実行時に別途libgsl.dllとlibgslcblas.dllが必要です。(BASIC.EXEと同じフォルダに入れてください)
> ---中略---
> ぜひ、こちらもお試しください。

上記説明に基づいてWindowsXP(SP3)上のBASIC.exeで実行したのですが、「libgsl.dllとlibgslcblas.dllがロードできない」とのエラーが出てしまい、解決するのに時間を要しお返事が遅くなり申し訳ありません。

作業は次の順で行いました。
【作業1】1回目に頂いたdllホルダに、2回目に頂いたdllホルダ内ファイルを上書き保存。
【作業2】上書き保存後のdllホルダに、更に3回目に頂いたdllホルダ内ファイルを上書き保存。
【作業3】libgsl.dllとlibgslcblas.dllを[C:\Windows\System32\]ホルダに貼り付け。
(BASIC.exeがインストールされているホルダに貼り付けると、このdllは動作しなかった。)

【作業4】最初に頂いたbasホルダに、3回目に頂いたbasホルダ内ファイルを上書き保存。
【作業5】マイクロソフトのダウンロードサービスで、[x86用のvcredist_x86.exe]をダウンロードし、インストールした。
(このexeは、VC++2010のランタイムMSVCR100.dllをインストールするもので、これを実行しないと作業3で書いたlibgsl.dllとlibgslcblas.dllが動作しなかった。)

【作業6】129個の.BASを実行した結果、不動作は下記2個になりました(凄いです!!)。

[不動作のBASファイル名]   [不動作時のメッセージ]
 ● BESSELDLL.BAS    bessel.dllをロードできない。
               ASSIGN ".\DLL\bessel.dll","dj0",FPU

 ● COMPLEXDLL.BAS      PRINT CARG(X)で エラー:EXTYPE -9900

なお、bessel.dllは先のdllホルダ内に在る事は確認しました。
以上、2回目の確認結果です。
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月23日(火)06時33分17秒
  前結果報告文のうち、【作業3】の訂正です(島村1243)。

***訂正前の記述***
> 【作業3】libgsl.dllとlibgslcblas.dllを[C:\Windows\System32\]ホルダに貼り付け。
> (BASIC.exeがインストールされているホルダに貼り付けると、このdllは動作しなかった。)

***訂正後の記述***
【作業3】libgsl.dllとlibgslcblas.dllをBASIC.exeがインストールされているホルダに貼り付ける。
( [C:\Windows\System32\]ホルダに貼り付けでも動作するが、上記の方がファイルを管理し易い。)






 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月24日(水)19時35分48秒
  > No.4678[元記事へ]

島村1243さんへのお返事です。

> この結果、Windows2000上のBASIC.exeでは特殊関数の利用は諦めないとダメの様でした。


既にサポート切れで、リンク切れしかないだろうと諦めていたVC++2008の入手が出来ました。

http://gurigumi.s349.xrea.com/programming/visualcpp/install2.html



isoファイルをダウンロードし、フリーソフトのisoマウントソフトを使ってDVDに焼くことなく
インストールできました。

そして、VC++2008で可能な119本がコンパイル出来ました。VC++2008でコンパイルされたファイルはWindows 2000に対応しているようです。

また、GSLライブラリー関係はWindows XP 同様に実行時に、libgsl.dllとlibgslcblas.dllが必要です。
しかしながら、Windows 2000がlibgsl.dll及びlibgslcblas.dllに対応しているかは分かりません。


こちらで試してみるとコンパイルの仕方が悪かったのか、VC++2008でのdllが対応していないのかロードできないとエラーが
頻発してしまいました。(念のため VC++2008のランタイムはインストールしました)



とりあえず、下記にアップしておきました。dllファイルのみ(dll.zip)

https://10.gigafile.nu/0922-c812d54b044b39d9b69632b7e83ebdf5c


ダウンロード期限:2019年9月22日(日)


ぜひ、Windows 2000でお試しください。


 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月25日(木)19時56分46秒
  > No.4687[元記事へ]

> こちらで試してみるとコンパイルの仕方が悪かったのか、VC++2008でのdllが対応していないのかロードできないとエラーが
> 頻発してしまいました。(念のため VC++2008のランタイムはインストールしました)



VC++2008でのGSLライブラリーのコンパイルがうまくいっていなかったようです。
設定を変えてVC++2008で再コンパイルしましたので、下記からダウンロードしたdllファイルと置き換えてください。

こちらにアップロードしておきました(gsl.zip)

https://29.gigafile.nu/0923-c053c5efdee728c42009f9bdb03139651

ダウンロード期限:2019年9月23日(月)
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月27日(土)09時02分52秒
  しばっち様へのお返事です。

> VC++2008でのGSLライブラリーのコンパイルがうまくいっていなかったようです。
> 設定を変えてVC++2008で再コンパイルしましたので、下記からダウンロードしたdllファイルと置き換えてください。
>
> こちらにアップロードしておきました(gsl.zip)
>
> https://29.gigafile.nu/0923-c053c5efdee728c42009f9bdb03139651
> ダウンロード期限:2019年9月23日(月)

Windows2000でも使えるようにと、度重なるご尽力を頂き、本当に有難うございます。
ご提供頂いたwindows2000用のdll.zipとgsl.zipを使用させて頂き、結果をご報告致します。
なお、結果のご報告までに暫くお時間を頂きたくお願い申し上げます。
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月29日(月)07時43分9秒
  > No.4688[元記事へ]

しばっち様へのお返事です。

> VC++2008でのGSLライブラリーのコンパイルがうまくいっていなかったようです。
> 設定を変えてVC++2008で再コンパイルしましたので、下記からダウンロードしたdllファイルと置き換えてください。
> こちらにアップロードしておきました(gsl.zip)
> ダウンロード期限:2019年9月23日(月)

Winndows2000(SP4)で動作確認の結果報告です。
ご提供いただいたBASプログラム(合計132個)の内、動作しなかったBAS名と原因は次のとおりでした。

(1)動作しなかったBAS名(11個)とその原因
  BESSELDLL.BAS  bessel.dllが無い。
  COMPELLINTDLL.BAS  comp_ellint.dllが無い。
  COMPLEXDLL.BAS  PRINT CARG(X)でエラー:EXTYPE -9900
  GAMMADLL.BAS  gamma.dlが無い。
  ERFDLL.BAS      erf.dllが無い。
  EXPINTDLL2.BAS  expint2.dllが無い。
  GAMMADLL.BAS  gamma.dllが無い。
  POLYNOMIALSDLL2.BAS  polynomials2.dllが無い。
  SPHBESSELDLL.BAS  sphbessel.dllが無い
  SPHBESSELDLL2.BAS  sphbessel2.dllが無い。
  ZETADLL2.BAS  zeta2.dllが無い。

上記の内、
・ベッセル関数(bessel.dll)
 WinXP版はdllが有ってもロード失敗。ベッセル関数はWin2KとWinXPの両方で利用不可状態。
・ガンマ関数(gamma.dll)<---WinXP版は使える。
・誤差関数(erf.dll)<---WinXP版は使える。

工学上でベッセル関数(bessel.dll)はよく出てくるので、Win2K、WinXPのいずれかで使えるようになると嬉しいです。。。

(2)BASコードを直したら動作したBAS名(2個)
 ・HYPERBOLICINTEGRALDLL.BAS:hyperbolicintegral.dllをロードできない。
   BAS側のdll呼び出し名を『hyperbolicinteger.dll』に修正して解決。

 ・SINCOSINTEGRALDLL.BAS:sincosintegerals.dllをロードできない。
   BAS側のdll呼び出し名を『sincosinteger.dll』に修正して解決。

以上です。







 

Re: 特殊関数

 投稿者:しばっち  投稿日:2019年 7月30日(火)20時52分16秒
  > No.4690[元記事へ]

島村1243さんへのお返事です。

> Winndows2000(SP4)で動作確認の結果報告です。
> ご提供いただいたBASプログラム(合計132個)の内、動作しなかったBAS名と原因は次のとおりでした。
>
> (1)動作しなかったBAS名(11個)とその原因
>   BESSELDLL.BAS  bessel.dllが無い。
>   COMPELLINTDLL.BAS  comp_ellint.dllが無い。
>   COMPLEXDLL.BAS  PRINT CARG(X)でエラー:EXTYPE -9900
>   GAMMADLL.BAS  gamma.dlが無い。
>   ERFDLL.BAS      erf.dllが無い。
>   EXPINTDLL2.BAS  expint2.dllが無い。
>   GAMMADLL.BAS  gamma.dllが無い。
>   POLYNOMIALSDLL2.BAS  polynomials2.dllが無い。
>   SPHBESSELDLL.BAS  sphbessel.dllが無い
>   SPHBESSELDLL2.BAS  sphbessel2.dllが無い。
>   ZETADLL2.BAS  zeta2.dllが無い。

sphbessel2.dll(boostライブラリー版)はこちらの同梱ミス(入れ忘れ)です。失礼致しました。
それ以外の残り10個はC++17規格のものでVC++2017かVC++2019でしかコンパイルできません。
VC++2017,VC++2019でコンパイルされたファイルはXP以上でしか動きません。

VC++2008でコンパイルしてアップしました。
下記からダウンロードしてください。(sphbessel2.zip)


https://38.gigafile.nu/0928-d947544764f375aa252f7124d7d67e1e4
ダウンロード期限:2019年9月28日(土)




> ・ベッセル関数(bessel.dll)
>  WinXP版はdllが有ってもロード失敗。ベッセル関数はWin2KとWinXPの両方で利用不可状態。
> ・ガンマ関数(gamma.dll)<---WinXP版は使える。
> ・誤差関数(erf.dll)<---WinXP版は使える。
>
> 工学上でベッセル関数(bessel.dll)はよく出てくるので、Win2K、WinXPのいずれかで使えるようになると嬉しいです。。。


ベッセル関数関係は5本のdllがあり、bessel.dllはbessel_j0(x),bessel_j1(x),bessel_jn(n,x),bessel_y0(x),bessel_y1(x),bessel_yn(n,x)の
6個(nは整数,xは実数)を定義していますが、bessel2.dll,bessel3.dllと被っている上にGSLライブラリー版のbessel4.dllではbesseljnu(n,x),besselynu(n,x)
besselinu(n,x),besselknu(n,x)ではn,xを実数で指定できます。
besselyn(n,x),besselin(n,x),besselkn(n,x),besseljn(n,x)もあります。(nは整数,xは実数)

定義が被っているのでbessel.dllの代わりにbessel2.dll,bessel3.dll,bessel4.dllで代用してください。


ガンマ関数関係はdllを5本入れていてgamma.dllではtgamma(x)とlgamma(x)のガンマ関数、対数ガンマ関数でベータ関数と組み合わせ数comb(n,k),順列perm(n,k)は
ガンマ関数を使って定義しているだけです。

gamma2.dllが動くなら定義が被っているうえにgamma.dllにはないディガンマ関数、トリガンマ関数、ポリガンマ関数に逆ガンマ関数(y=gamma(x) → x=invgamma(y))
も定義しています。ベータ関数や組み合わせ数 BINOM(N,K)、順列 DPERM(N,K)もあります。
gamma2.dll,gamma3.dll,gamma4.dllで代用してください。


誤差関数も4本あり、erf.dllはerf2.dll,erf3.dll,erf4.dllと内容が被っています。
erf2.dllでは誤差関数の逆関数erfinv(x),erfcinv(x)も定義しています。


複数のライブラリーを使用しているために、内容(定義)が被ってしまうので
どれか動くdllで代用してください。


> (2)BASコードを直したら動作したBAS名(2個)
>  ・HYPERBOLICINTEGRALDLL.BAS:hyperbolicintegral.dllをロードできない。
>    BAS側のdll呼び出し名を『hyperbolicinteger.dll』に修正して解決。
>
>  ・SINCOSINTEGRALDLL.BAS:sincosintegerals.dllをロードできない。
>    BAS側のdll呼び出し名を『sincosinteger.dll』に修正して解決。


こちら側のミスです。dll名をあとで変更したのが原因でBASファイルの定義を修正し忘れていたようです。
失礼致しました。

integral(積分)が正しい名です。integer(整数)では間違いです。正弦積分、余弦積分でsincosintegralです。
hyperbolic(双曲線、sinh,cosh)の積分でhyperbolicintegralです。(あとは複数形でsがつく?)


VC++2008でコンパイルしたdllはXPでも動くはずなのですが...
 

Re: 特殊関数

 投稿者:島村1243  投稿日:2019年 7月31日(水)05時05分14秒
  > No.4691[元記事へ]

しばっち様へのお返事です。

> sphbessel2.dll(boostライブラリー版)はこちらの同梱ミス(入れ忘れ)です。失礼致しました。
> それ以外の残り10個はC++17規格のものでVC++2017かVC++2019でしかコンパイルできません。
> VC++2017,VC++2019でコンパイルされたファイルはXP以上でしか動きません。
>
> VC++2008でコンパイルしてアップしました。
> 下記からダウンロードしてください。(sphbessel2.zip)
> ダウンロード期限:2019年9月28日(土)

ソースコード作成に用いられているC++バージョンの違いに依り、コンパイルしてもWin2KやWinXPで動作しないものが有るとのご説明で納得しました。
当方のPC上で動作した特殊関数dllは、工学書の学習時に計算で使わせて頂きます。

こちらの勝手なお願いにも関わらず、度重なるコンパイル作業を繰り返してくださり、本当に有難う御座いました。
 

戻る