投稿者:しばっち
投稿日:2019年 7月 7日(日)16時07分22秒
|
|
|
投稿者:島村1243
投稿日:2019年 7月10日(水)08時08分46秒
|
|
|
> No.4673[元記事へ]
しばっちさんへのお返事です。
十進BASICのnative関数にはない、とても有用な関数だと思います。
> サンプル画像はガンマ関数 gamma(x)のグラフを描かせてみました。
その関数をBASメインプログラムからどの様に呼び出せば良いのかを知りたいのですが、上記グラフを描いたBASコードをご教示頂けないでしょうか?
|
|
|
投稿者:しばっち
投稿日: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
|
|
|
投稿者:島村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ファイルへの絶対パスに書き換えてください。
ご丁寧なご教示、有難うございました。
早速、倣って実行してみたいと思います。
|
|
|
投稿者:しばっち
投稿日: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
|
|
|
投稿者:島村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では特殊関数の利用は諦めないとダメの様でした。
以上、報告です。
|
|
|
投稿者:しばっち
投稿日: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に対応させていくのは
難しいかもしれません。
|
|
|
投稿者:島村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は持っていない)。
|
|
|
投稿者:しばっち
投稿日: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
|
|
|
投稿者:島村1243
投稿日:2019年 7月16日(火)09時12分24秒
|
|
|
しばっち様へのお返事です。
> gslライブラリーによるものと標準ライブラリーの規格C++17によるものはvc++2010ではコンパイルできませんが、
> それ以外のalglibライブラリーとboostライブラリーによる特殊関数についての93本ばかりをvc++2010にて再コンパイルしてみました。
>
> もしかしたらこれでWindow XPでも動くかもしれません。以前ダウンロードしたdllフォルダの名前を他に変更(または移動)しておいて(上書きはせずに)
> 下記からダウンロードし解凍してできたdllフォルダに置き換えて、ぜひ実行してみてください。
お手数のかかる再コンパイルをして頂き、WindowsXPを使う私にとって非常に有り難いです。
ご提供頂いた新dllを適用して全BASプログラムを走らせ、「どれが動作し、どれが動作しないか」の結果を、追ってご報告致しますので、しばらくお時間を頂きたく思います。
|
|
|
投稿者:島村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)
以上です。
|
|
|
投稿者:しばっち
投稿日: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日(日)
ぜひ、こちらもお試しください。
|
|
|
投稿者:島村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回目の確認結果です。
|
|
|
投稿者:島村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\]ホルダに貼り付けでも動作するが、上記の方がファイルを管理し易い。)
|
|
|
投稿者:しばっち
投稿日: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でお試しください。
|
|
|
投稿者:しばっち
投稿日:2019年 7月25日(木)19時56分46秒
|
|
|
投稿者:島村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を使用させて頂き、結果をご報告致します。
なお、結果のご報告までに暫くお時間を頂きたくお願い申し上げます。
|
|
|
投稿者:島村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』に修正して解決。
以上です。
|
|
|
投稿者:しばっち
投稿日: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でも動くはずなのですが...
|
|
|
投稿者:島村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は、工学書の学習時に計算で使わせて頂きます。
こちらの勝手なお願いにも関わらず、度重なるコンパイル作業を繰り返してくださり、本当に有難う御座いました。
|
|
|
戻る