
書き込みテスト
- SHIRAISHI Kazuo
2026/08/12 (Wed) 21:52:42
書き込みテスト
十進BASIC ヘルプ索引より
ABS (数値関数)
ABS (複素関数)
ACCESS INPUT
ACCESS OUTIN
ACCESS OUTPUT
ACOS
AND
ANGLE (OPTION ANGLE)
ANGLE (三角関数)
AREA
ARG
ARITHEMTIC DECIMAL
ARITHMETIC
ASC (Microsoft BASIC)
ASIN
ASK AXIS COLOR
ASK BITMAP SIZE
ASK CHARACTER PENDING
ASK COLOR MIX
ASK DIRECTORY
ASK LINE COLOR
ASK LINE STYLE
ASK MAX COLOR
ASK MAX LINE STYLE
ASK MAX POINT STYLE
ASK PIXEL ARRAY
ASK PIXEL SIZE
ASK PIXEL VALUE
ASK POINT COLOR
ASK POINT STYLE
ASK TEXT COLOR
ASK TEXT JUSTIFY
ASK WINDOW
ASSIGN
ASSOC PRINT
ATN
AXES
AXES0
BACKGROUND (True BASIC)
BASE
BEEP
BITMAP
BLEN
BOX (True BASIC)
BREAK (続行可能例外)
BREAK (Debug)
BSTR$
BVAL
BYTE (漢字)
BYTE (CHARACTER INPUT #)
CALL (内部副プログラム)
CALL (外部副プログラム)
CASE
CASE ELSE
CAUSE
CAUSE EXCEPTION
CEIL
CELLS
CHAIN
CHARACTER INPUT
CHARACTER INPUT #
CHARACTER PENDING (character input)
CHARACTER PENDING (CHARACTER INPUT #)
CHR$
CINT (Microsoft BASIC)
CIRCLE (Microsoft BASIC)
CIRCLE (DRAW CIRCLE)
CLEAR (グラフィックス)
CLEAR (character input)
CLEAR (CHARACTER INPUT #)
CLEAR (N88-BASIC)
CLOSE
CLS (Microsoft BASIC)
CLS (N88-BASIC)
COLOR (Microsoft BASIC)
COLOR MIX
COLOR MODE
COLORINDEX
COM1
COM2
COMB
COMPLEX (Complex Numbers)
COMPLEX (Complex Functions)
CON
CONJ
CONSOLE (N88-BASIC)
CONTINUE
COS
COSH
COT
CSC
CSV
DATA
DATE
DATE$ (Time)
DATE$ (文字列関数)
DEBUG
DECIMAL
DECLARE
DECLARE EXTERNAL
DECLARE EXTERNAL FUNCTION
DECLARE NUMERIC
DECLARE STRING
DEF
DEFDBL (Microsoft BASIC)
DEFINT (Microsoft BASIC)
DEG
DEGREES
DELETE
DENOM
DET
DEVICE
DIM (配列)
DIM (実行DIM文)
DIRECTORY
DISK
DO
DOT
DRAW
DRAW AXES
DRAW GRID
DRAW MODE
ECHO
ELAPSED
ELSE
ELSEIF
END (Microsoft BASIC)
END FUNCTION (関数定義(内部))
END FUNCTION (外部関数定義)
END IF
END SELECT
END WHEN
ENDOFLINE
EOF (Microsoft BASIC)
EPS (関数)
ERASE
EXCEPTION (WHENEXCEPTION)
EXCEPTION (cause-exception)
EXECUTE
EXIT DO
EXIT FOR
EXIT FUNCTION
EXIT HANDLER
EXIT PICTURE
EXIT SUB
EXP (数値関数)
EXP (複素関数)
EXTERNAL FUNCTION
EXTERNAL PICTURE
EXTERNAL SUB
EXTYPE
FACT
FILE
FILE DELETE
FILE GETNAME
FILE RENAME
FILE SPLITNAME
FIX (Microsoft BASIC)
FLOOD
FONT
FOR
FOR APPEND (Microsoft BASIC)
FOR INPUT (Microsoft BASIC)
FOR OUTPUT (Microsoft BASIC)
FP
FUNCTION
GET POINT
GETKEYSTATE
GLOAD
GOSUB
GOTO
GRAPH
GRID
GRID0
GSAVE
HANDLER
HEX$
HIDDEN
IDN
IF (IF .. END IF)
IF (IF THEN)
IM
IMAGE
INKEY$ (Microsoft BASIC)
INPUT (INPUT)
INPUT (続行可能例外)
INPUT (INPUT #)
INPUT #
INPUT ELAPSED
INPUT PROMPT
INPUT TIMEOUT
INSTR (Microsoft BASIC)
INT
INTERNAL
INTSQR
INV
IP
KANJI
KEY
KILL (Microsoft BASIC)
LBOUND
LCASE$
LEFT$
LET
LIBRARY (True BASIC)
LIMIT
LINE (Microsoft BASIC)
LINE (Microsoft BASIC)
LINE COLOR
LINE INPUT
LINE INPUT #
LINE STYLE
LINES
LOCATE (N88-BASIC)
LOCATE POINT
LOG (数値関数)
LOG (複素関数)
LOG10
LOG2
LOOP
LPRINT (Microsoft BASIC)
LTRIM$
MARGIN (SET MARGIN)
MARGIN (SET# MARGIN (file))
MAT (数値配列)
MAT (文字列配列)
MAT (MAT Transform)
MAT GRAPH CELLS
MAT INPUT
MAT PLOT
MAT PLOT AREA
MAT PLOT CELLS
MAT PLOT LINES
MAT PLOT POINTS
MAT PRINT
MAT PRINT USING
MAT READ
MAT REDIM
mat-cells
MAX
MAXNUM
MAXSIZE
MERGE
MID$
MIN
MISSING
MIX
MOD (数値関数)
MOD (Microsoft BASIC)
MODULE
MORE (True BASIC)
MOUSE POLL
NAME
NATIVE
NEXT
NOBEAMOFF
NOT
NOTXOR
NOWAIT (character input)
NOWAIT (EXECUTE NOWAIT)
NOWAIT (CHARACTER INPUT #)
NUL$
NUMER
NUMERIC
ON ERROR GOTO (Microsoft BASIC)
OPEN (open)
OPEN (Microsoft BASIC)
OPTION ANGLE DEGREES
OPTION ANGLE RADIANS
OPTION ARITHMETIC COMPLEX
OPTION ARITHMETIC DECIMAL
OPTION ARITHMETIC NATIVE
OPTION ARITHMETIC RATIONAL
OPTION BASE
OPTION CHARACTER
OR
ORD
ORG
ORGANIZATION
OUTIN
OUTPUT
OVERWRITE
PAINT (Microsoft BASIC)
PAINT (独自拡張)
PAUSE
PDF
PENDING (character input)
PENDING (CHARACTER INPUT #)
PERM
PI
PICTURE
PIXEL
PIXEL ARRAY
PIXEL SIZE
PIXEL VALUE
PIXELX
PIXELY
PLAY
PLOT (True BASIC)
PLOT (PLOT x, y)
PLOT AREA
PLOT LABEL
PLOT LINES
PLOT POINTS
PLOT TEXT
POINT
POINT COLOR
POINT STYLE
POINTER BEGIN
POINTER END
POINTS
POLL
POS
PostScript
PRINT
PRINT #
PRINT USING
PRINTER (Graphics device)
PRINTER (OPEN# PRINTER)
PRIVATE (True BASIC)
PROBLEMX
PROBLEMY
PROGRAM
PROMPT
PSET (Microsoft BASIC)
PSET (Microsoft BASIC)
PUBLIC
RAD
RADIANS
RANDOMIZE
RATIONAL
RE
READ
READ IF MISSING
RECTYPE
REDIM
REMAINDER
RENAME
REPEAT$
RESTORE
RESUME (Microsoft BASIC)
RETRY
RETURN
RIGHT$
RND
ROTATE
ROUND
RTRIM$
SCALE
SCREEN (Microsoft BASIC)
SEC
SELECT CASE
SET AREA COLOR
SET BITMAP SIZE
SET COLOR MIX
SET COLOR MODE
SET DIRECTORY
SET ECHO
SET LINE COLOR
SET LINE STYLE
SET MARGIN
SET POINT COLOR
SET POINT STYLE
SET TEXT COLOR
SET TEXT FONT
SET TEXT HEIGHT
SET TEXT JUSTIFY
SET WINDOW
SET ZONEWIDTH
SGN
SHARE
SHEAR
SHIFT
SIN
SINH
SIZE (SIZE function)
SIZE (PIXEL SIZE)
SPACE$
SPC
SPLITNAME
SQR (Numeric functions)
SQR (Complex functions)
STEP
STOP
STR$
STREAM
STRING
STRING$ (Microsoft BASIC)
SUB (Internal subprogram)
SUB (EXTERNAL SUB)
SUBSTR$
SWAP
TAB
TAN
TANH
TEXT
TEXT FONT
TEXT JUSTIFY
THEN
TIME
TIME$ (Time)
TIME$ (String functions)
TIMEOUT
TO (DIM)
TO (CASE)
TO (FOR)
TRACE
TRANSFORM
TRN
TRUNCATE
TYPO (True BASIC)
UBOUND
UCASE$
UNSAVE (True BASIC)
UNTIL
USE
USING (PRINT USING)
USING (MAT PRINT USING)
USING$
VAL
WAIT DELAY
WEND (Microsoft BASIC)
WHEN EXCEPTION IN
WHEN EXCEPTION USE
WHILE (DO WHILE, LOOP WHILE)
WINDOW (SET WINDOW)
WINDOW (Microsoft BASIC)
WITH
WORLDX
WORLDY
WRITE
ZER
ZONEWIDTH
このリストにある単語であれば,禁止ワードとされる可能性は低いと思われます。
Re: 書き込みテスト Full BASIC 機能語
- SHIRAISHI Kazuo
2026/08/12 (Wed) 22:07:09
Full BASIC機能語の追加分です。
CONNECT
COLLATE
DATUM
DELAY
DELETE
DISCONNECT
DISPLAY
ERASABLE
EVENT
EXTEXT
EXTRACT
FILETYPE
FIRST
FIXED
FROM
GET
KEY
KEYED
MESSAGE
MIDDLE
MULTIPOINT
PARACT
PARSTOP
PORT
PROCESS
PROGRAM
PUT
RECEIVE
SEIZE
SHARED
シグナル
START
VIEWPORT
「シグナル」を英語の綴りにすると
メッセージに禁止ワードが含まれているため投稿できません
と表示されて書き込めません。
Re: 書き込みテスト
- SHIRAISHI Kazuo
2026/08/12 (Wed) 22:15:11
シグナルの英語綴り以外で「禁止ワード」に遭遇されたら,二分探索法などを適用して,禁止ワードを特定し,指摘いただけると幸いです。
編集/削除キーを指定したうえで,禁止ワードを含むテキストを2つに分け,投稿し,NGだった側をまた2つに分け,・・・を繰り返すと禁止ワードの特定ができます。
不要になった投稿は,削除キーで削除してください。
なお,英字のみの投稿は拒絶されるので,必ず,日本語を含めてテストしてください。
Re: 書き込みテスト
- SHIRAISHI Kazuo
2026/08/13 (Thu) 07:39:12
Full BASIC文字列定数のテスト。順不同。
"NONE"
"UNKNOWN"
"YES"
"NO"
"FILE"
"DEVICE"
"SEQUENTIAL"
"STREAM"
"RELATIVE"
"KEYED"
"BEGIN"
"MIDDLE"
"END"
"VARIABLE"
"ON", "OFF"
"METERS", "OTHER"
"LEFT", "CENTER", "RIGHT"
"TOP", "CAP", "HALF", "BASE", "BOTTOM"
"PRESENT", "ABSENT"
"HOLLOW", SOLID", PATTERN", "HATCH"
Re: 書き込みテスト
- SHIRAISHI Kazuo
2026/08/13 (Thu) 07:40:23
十進BASIC独自拡張の定数と命令文,関数名
"TRANSPARENT" "OPAQUE"
SET DRAW MODE HIDDEN
SET DRAW MODE EXPLICIT
SET DRAW MODE OVERWRITE
SET DRAW MODE MASK
SET DRAW MODE MERGE
SET DRAW MODE XOR
SET DRAW MODE NOTXOR
SET COLOR MODE
"NATIVE","REGULAR"
COLORINDEX
OLE CreateObject
CALLBACK
CallBackAdr
WINHANDLE
BYTE$
WORD$
DWORD$
PACKDBL$
UNPACKDBL
PRINTER
TextWindow
baud parity data stop
複素数クッキング
- しばっち
2026/08/11 (Tue) 07:39:48
複素数クッキング (複素数はいくらでも創り出せる !?)
まず、複素数 A+Biを極形式で表すと
R*(COSθ+iSINθ) 又は 1/R*(SECθ+iCOSECθ)
と表せる
LET A=2
LET B=3
PRINT A;B
LET R=SQR(A^2+B^2)
LET TH=ATN(B/A)
PRINT R*COS(TH);R*SIN(TH)
LET R=SQR(1/A*1/A+1/B*1/B)
LET TH=ACOT(B/A)
PRINT 1/R*SEC(TH);1/R*CSC(TH)
END
EXTERNAL FUNCTION ACOT(X)
LET ACOT=ATN(1/X)
END FUNCTION
----------------------------------------------------------------
ユークリッド距離以外の方法もある。
ユークリッド距離 R=SQR(A^2+B^2)
マンハッタン距離 R=ABS(A)+ABS(B)
ミンコフスキー距離 R=(A^N+B^N)/(1/N) 更に一般化すると
R=(A^N+B^M)^(2/(N+M))
チェビチェフ距離 R=MIN(A,B)
R=MAX(A,B)
これらを組み合わせると様々な新・複素数が定義できる。
複素数モードで実行してください
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
SET WINDOW -2,2,-2,2
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET C=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR K=1 TO KMAX
WHEN EXCEPTION IN
LET Z=POW(Z,2)+C
IF ABS(Z)>2 THEN
SET POINT COLOR MOD(K,7)+1
PLOT POINTS:WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
USE
END WHEN
NEXT K
NEXT X
NEXT Y
END
EXTERNAL FUNCTION POW(Z,N)
LET X=RE(Z)
LET Y=IM(Z)
LET L=2
LET M=3
LET R=SQR(X^2+Y^2)
!LET R=(ABS(X)^L+ABS(Y)^M)^(2/(L+M))
!LET R=ABS(X)+ABS(Y)
IF R=0 THEN
LET POW=0
EXIT FUNCTION
ELSE
LET T=ANGLE(X,Y)
! LET T=ANGLE(Y,X)
! LET T=ANGLE(SQR(X^2+Y^2),X-Y)
END IF
LET POW=R^N*COMPLEX(COS(T*N),SIN(T*N))
!LET POW=R^N*COMPLEX(SIN(T*N),COS(T*N))
!LET POW=R^N*COMPLEX(SEC(T*N),SIN(T*N))
!LET POW=R^N*COMPLEX(SEC(T*N),COS(T*N))
!LET POW=R^N*COMPLEX(CSC(T*N),SEC(T*N))
!LET POW=R^N*COMPLEX(TAN(T*N),SEC(T*N))
!LET POW=R^N*COMPLEX(COSH(T*N),SINH(T*N))
END FUNCTION
----------------------------------------------------------------
複素数を次のように定義する
R(COS(Kθ)^N+iSIN(Lθ)^N)
パラメータK,L,Nをいじると無数に新・複素数を創り出せる
まずはそのグラフを描いてみた。
SET WINDOW 0,2*PI,-1,1
DRAW GRID
FOR N=1 TO 8
SET LINE COLOR N
FOR T=0 TO 2*PI STEP 1/64
PLOT LINES:T,SN(T,N,1);
NEXT T
PLOT LINES
FOR T=0 TO 2*PI STEP 1/64
PLOT LINES:T,SN(T,1/N,1);
NEXT T
PLOT LINES
NEXT N
PLOT LINES
PAUSE
CLEAR
SET WINDOW -1,1,-1,1
LET K=1
LET L=1
FOR N=1 TO 8
SET LINE COLOR N
FOR T=0 TO 2*PI STEP 1/64
PLOT LINES:CN(T,N,K),SN(T,N,L);
NEXT T
PLOT LINES
FOR T=0 TO 2*PI STEP 1/64
PLOT LINES:CN(T,1/N,K),SN(T,1/N,L);
NEXT T
PLOT LINES
NEXT N
END
EXTERNAL FUNCTION SN(X,N,K)
LET SN=SGN(SIN(X*K))*ABS(SIN(X*K))^N
END FUNCTION
EXTERNAL FUNCTION CN(X,N,K)
LET CN=SGN(COS(X*K))*ABS(COS(X*K))^N
END FUNCTION
----------------------------------------------------------------
その新・複素数でZ←Z^N+Cのマンデルブローを描かせてみた。
変数N,M1,M2,K,L,P,Qのバラメータをいじってみてください。
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
SET WINDOW -2,2,-2,2
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
LET M1=1
LET M2=1
LET K=1
LET L=1
LET P=0
LET Q=0
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET C=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR KK=1 TO KMAX
WHEN EXCEPTION IN
LET Z=POW(Z,N,M1,M2,K,L,P,Q)+C
IF ABS(Z)>2 THEN
SET POINT COLOR MOD(KK,7)+1
PLOT POINTS:WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
USE
EXIT FOR
END WHEN
NEXT KK
NEXT X
NEXT Y
END
EXTERNAL FUNCTION SN(X,N,K,P)
LET SN=SGN(SIN(X*K+P*PI))*ABS(SIN(X*K+P*PI))^N
END FUNCTION
EXTERNAL FUNCTION CN(X,N,K,Q)
LET CN=SGN(COS(X*K+Q*PI))*ABS(COS(X*K+Q*PI))^N
END FUNCTION
EXTERNAL FUNCTION POW(X,N,M1,M2,K,L,P,Q)
LET R=SQR(RE(X)^2+IM(X)^2)
IF ABS(X)=0 THEN
LET T=0
ELSE
LET T=ANGLE(RE(X),IM(X))
END IF
LET POW=R^N*COMPLEX(CN(T*N,M1,K,P),SN(T*N,M2,L,Q))
END FUNCTION
----------------------------------------------------------------
新・複素数によるニュートンフラクタル x←x-(x^n-1)/(n*x^(n-1))
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
SET WINDOW -2,2,-2,2
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=3
LET M1=1
LET M2=1
LET K=1
LET L=1
LET P=0
LET Q=0
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET Z=COMPLEX(WORLDX(X),WORLDY(Y))
FOR KK=1 TO KMAX
WHEN EXCEPTION IN
LET ZZ=Z-DIV(POW(Z,N,M1,M2,K,L,P,Q)-1,N*POW(Z,N-1,M1,M2,K,L,P,Q),M1,M2,K,L,P,Q)
IF ABS(ZZ-Z)<1E-5 THEN
SET POINT COLOR MOD(KK,7)+1
PLOT POINTS:WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
USE
EXIT FOR
END WHEN
LET Z=ZZ
NEXT KK
NEXT X
NEXT Y
END
EXTERNAL FUNCTION SN(X,N,K,P)
LET SN=SGN(SIN(X*K+P*PI))*ABS(SIN(X*K+P*PI))^N
END FUNCTION
EXTERNAL FUNCTION CN(X,N,K,Q)
LET CN=SGN(COS(X*K+Q*PI))*ABS(COS(X*K+Q*PI))^N
END FUNCTION
EXTERNAL FUNCTION DIV(X,Y,M1,M2,K,L,P,Q)
LET R1=SQR(RE(X)^2+IM(X)^2)
LET R2=SQR(RE(Y)^2+IM(Y)^2)
IF ABS(X)=0 THEN
LET T1=0
ELSE
LET T1=ANGLE(RE(X),IM(X))
END IF
IF ABS(Y)=0 THEN
LET T2=0
ELSE
LET T2=ANGLE(RE(Y),IM(Y))
END IF
LET DIV=R1/R2*COMPLEX(CN(T1-T2,M1,K,P),SN(T1-T2,M2,L,Q))
END FUNCTION
EXTERNAL FUNCTION POW(X,N,M1,M2,K,L,P,Q)
LET R=SQR(RE(X)^2+IM(X)^2)
IF ABS(X)=0 THEN
LET T=0
ELSE
LET T=ANGLE(RE(X),IM(X))
END IF
LET POW=R^N*COMPLEX(CN(T*N,M1,K,P),SN(T*N,M2,L,Q))
END FUNCTION
Re: 複素数クッキング
- しばっち
2026/08/11 (Tue) 08:14:49
三角波を定義してみました。
ST(X)とπ/2周期ずれたCT(X)を
CT(X)=ST(X+PI/2)と定義します。(周期2π)
定義した関数のグラフを描いてみました。
SET WINDOW 0,2*PI,-1,1
DRAW GRID
LET K=1
FOR N=1 TO 8
SET LINE COLOR N
FOR X=0 TO 2*PI STEP 1/32
PLOT LINES:X,ST(X,N,K);
NEXT X
PLOT LINES
NEXT N
PAUSE
CLEAR
SET WINDOW 0,2*PI,-1,1
DRAW GRID
LET L=1
LET K=1
FOR N=1 TO 8
SET LINE COLOR N
FOR X=0 TO 2*PI STEP 1/32
LET Y=TT(X,N,K,L)
IF SGN(YY)<>SGN(Y) THEN
PLOT LINES
ELSE
PLOT LINES:X,Y;
END IF
LET YY=Y
NEXT X
PLOT LINES
NEXT N
PAUSE
CLEAR
SET WINDOW -1,1,-1,1
DRAW GRID
LET K=1
LET L=1
FOR N=1 TO 8
SET LINE COLOR N
FOR X=0 TO 2*PI STEP 1/32
PLOT LINES:CT(X,N,K),ST(X,N,L);
NEXT X
PLOT LINES
NEXT N
END
EXTERNAL FUNCTION ST(X,N,K)
LET ST=SGN(ASIN(SIN(X*K))/PI*2)*ABS(ASIN(SIN(X*K))/PI*2)^N
END FUNCTION
EXTERNAL FUNCTION CT(X,N,K)
LET CT=ST(X+PI/2,N,K)
!LET CT=ST(X+PI/3,N,K)
END FUNCTION
EXTERNAL FUNCTION TT(X,N,K,L)
LET TT=ST(X,N,K)/CT(X,N,L)
END FUNCTION
--------------------------------------------------------------------
三角波でもタートルグラフィックスはできるようだ
PUBLIC NUMERIC X,Y,ALPHA
SET WINDOW 0,1,0,1
DRAW GRID(.1,.1)
LET L=.25
LET N=1
LET K=1
CALL JUMP(.5,.2)
FOR I=3 TO 8
SET LINE COLOR I
FOR J=1 TO I
CALL TURN(360/I)
CALL MOVE(L)
NEXT J
NEXT I
SUB TURN(R)
LET ALPHA=MOD(ALPHA+R,360)
END SUB
SUB MOVE(L)
PLOT LINES:X,Y;
LET X=X+L*CT(RAD(ALPHA),N,K)
LET Y=Y+L*ST(RAD(ALPHA),N,K)
PLOT LINES:X,Y;
END SUB
SUB JUMP(XX,YY)
LET X=XX
LET Y=YY
END SUB
SUB JUMPTO(XX,YY)
LET X=X+XX
LET Y=Y+YY
END SUB
END
EXTERNAL FUNCTION ST(X,N,K)
LET ST=SGN(ASIN(SIN(X*K))/PI*2)*ABS(ASIN(SIN(X*K))/PI*2)^N
END FUNCTION
EXTERNAL FUNCTION CT(X,N,K)
LET CT=ST(X+PI/2,N,K)
!LET CT=ST(X+PI/3,N,K)
END FUNCTION
--------------------------------------------------------------------
三角波の直交性を相関関数で調べてみた。
LET N=1
LET K=1
FOR X=0 TO PI STEP 1/32
LET S=S+ST(X,N,K)^2
LET C=C+CT(X,N,K)^2
LET SC=SC+ST(X,N,K)*CT(X,N,K)
NEXT X
LET T=SC/SQR(S)/SQR(C)
PRINT ROUND(ACOS(T)*180/PI,3);"度"
PRINT "相関係数";T
IF ABS(T)<1E-3 THEN PRINT "直交です"
END
EXTERNAL FUNCTION ST(X,N,K)
!LET ST=SIN(X)
LET ST=SGN(ASIN(SIN(X*K))/PI*2)*ABS(ASIN(SIN(X*K))/PI*2)^N
END FUNCTION
EXTERNAL FUNCTION CT(X,N,K)
LET CT=ST(X+PI/2,N,K)
!LET CT=ST(X+PI/3,N,K)
END FUNCTION
--------------------------------------------------------------------
三角波以外も色々定義してグラフ描いてみた。
SET WINDOW 0,4*PI,-1.5,1.5
DRAW GRID
FOR X=0 TO 4*PI STEP 1/32
PLOT LINES:X,ST(X);
NEXT X
PLOT LINES
SET LINE COLOR 2
FOR X=0 TO 4*PI STEP 1/32
PLOT LINES:X,CT(X);
NEXT X
PLOT LINES
SET LINE COLOR 3
FOR X=0 TO 4*PI STEP 1/32
WHEN EXCEPTION IN
LET Y=TT(X)
IF SGN(Y)<>SGN(YY) THEN
PLOT LINES
ELSE
PLOT LINES:X,Y;
END IF
LET YY=Y
USE
END WHEN
NEXT X
END
EXTERNAL FUNCTION ST(X)
LET ST=SIN(X)
!LET ST=PULSE(X)
!LET ST=SQUARE(X)
!LET ST=TRIANGLE(X)
!LET ST=SAW(X)
!LET ST=SAW2(X)
!LET ST=TRAPEZOIDAL(X)
!LET ST=STEPSINE(X)
!LET ST=STEPWISE(X)
!LET ST=WEIERSTRASS(X)
!LET ST=(SQUARE(X)-SAW(X))/2
!LET ST=TRIANGLE(X)+SAW(X)
!LET ST=-STEPSINE(X)+TRAPEZOIDAL(X)
!LET ST=SAW(X)+SIN(X)
!LET ST=WEIERSTRASS(X)-SQUARE(X)
!LET ST=SIN(X)-SQUARE(X)
!LET ST=PULSE(X)-TRIANGLE(X)
!LET ST=STEPSINE(X)+SAW(X)
!LET ST=SQUARE(X)-TRIANGLE(X)
!LET ST=TRIANGLE(X)*NOISE(X)
END FUNCTION
EXTERNAL FUNCTION CT(X)
LET CT=ST(X+PI/2)
!LET CT=ST(X+PI/3)
END FUNCTION
EXTERNAL FUNCTION TT(X)
LET TT=ST(X)/CT(X)
END FUNCTION
EXTERNAL FUNCTION PULSE(X) !'パルス波
IF ABS(ABS(SIN(X))-1)<.01 THEN LET PULSE=SGN(SIN(X)) ELSE LET PULSE=0
END FUNCTION
EXTERNAL FUNCTION INVPULSE(X) !'逆パルス波
IF ABS(ABS(SIN(X))-1)<.01 THEN LET INVPULSE=0 ELSE LET INVPULSE=SGN(SIN(X))
END FUNCTION
EXTERNAL FUNCTION SQUARE(X) !'方形波
LET SQUARE=SGN(SIN(X))
END FUNCTION
EXTERNAL FUNCTION TRIANGLE(X) !'三角波
LET TRIANGLE=ASIN(SIN(X))/PI*2
END FUNCTION
EXTERNAL FUNCTION SAW(X) !'のこぎり波
LET SAW=MOD(X+2*PI,2*PI)/(2*PI)*2-1
END FUNCTION
EXTERNAL FUNCTION SAW2(X) !'逆のこぎり波
LET SAW2=(1-MOD(X+2*PI,2*PI)/(2*PI))*2-1
END FUNCTION
EXTERNAL FUNCTION ALTSAW(X,N,K) !'のこぎり波
LET S=FP(K*X/PI)*(-1)^INT(K*X/PI)
LET ALTSAW=SGN(S)*ABS(S)^N
END FUNCTION
EXTERNAL FUNCTION TRAPEZOIDAL(X) !'台形波
LET NN=MOD(X+2*PI,PI)
IF NN>PI/2 THEN LET NN=PI-NN
LET TRAPEZOIDAL=MIN(1,MAX(-1,NN*SGN(SIN(X))))
END FUNCTION
EXTERNAL FUNCTION STEPSINE(X)
LET N=10
LET STEPSINE=SIN(X)+SIN(N*X)/N
END FUNCTION
EXTERNAL FUNCTION STEPWISE(X) !'階段状
LET N=6
LET STEPWISE=INT(N*SIN(X))/N
END FUNCTION
EXTERNAL FUNCTION WEIERSTRASS(X) ! ワイエルシュトラス
LET A=.3
LET B=13
LET NMAX=-54*LOG2(A)
FOR N=0 TO NMAX
LET R=B^N*X
IF R>2^53 THEN LET R=MOD(R,2)
LET S=S+A^N*COS(R*PI)
NEXT N
LET WEIERSTRASS=S/(1/(1-A)) ! -1~1に正規化
END FUNCTION
-------------------------------------------------------------------
上記で定義した三角波の新・複素数でマンデルブロー描いてみました。(サンプル画像参照)
複素数モードで実行してください。
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
SET WINDOW -2,2,-2,2
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET C=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR K=1 TO KMAX
WHEN EXCEPTION IN
LET Z=POW(Z,2)+C
IF ABS(Z)>2 THEN
SET POINT COLOR MOD(K,7)+1
PLOT POINTS:WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
USE
EXIT FOR
END WHEN
NEXT K
NEXT X
NEXT Y
END
EXTERNAL FUNCTION ST(X) ! 三角波
LET ST=ASIN(SIN(X))/PI*2
END FUNCTION
EXTERNAL FUNCTION CT(X)
LET CT=ST(X+PI/2)
!LET CT=ST(X+PI/3)
END FUNCTION
EXTERNAL FUNCTION MUL(X,Y)
LET R1=SQR(RE(X)^2+IM(X)^2)
LET R2=SQR(RE(Y)^2+IM(Y)^2)
IF ABS(X)=0 THEN
LET T1=0
ELSE
LET T1=ANGLE(RE(X),IM(X))
END IF
IF ABS(Y)=0 THEN
LET T2=0
ELSE
LET T2=ANGLE(RE(Y),IM(Y))
END IF
LET MUL=R1*R2*COMPLEX(CT(T1+T2),ST(T1+T2))
END FUNCTION
EXTERNAL FUNCTION DIV(X,Y)
LET R1=SQR(RE(X)^2+IM(X)^2)
LET R2=SQR(RE(Y)^2+IM(Y)^2)
IF ABS(X)=0 THEN
LET T1=0
ELSE
LET T1=ANGLE(RE(X),IM(X))
END IF
IF ABS(Y)=0 THEN
LET T2=0
ELSE
LET T2=ANGLE(RE(Y),IM(Y))
END IF
LET DIV=R1/R2*COMPLEX(CT(T1-T2),ST(T1-T2))
END FUNCTION
EXTERNAL FUNCTION POW(X,N)
LET R=SQR(RE(X)^2+IM(X)^2)
IF ABS(X)=0 THEN
LET T=0
ELSE
LET T=ANGLE(RE(X),IM(X))
END IF
LET POW=R^N*COMPLEX(CT(T*N),ST(T*N))
END FUNCTION
批評・批判等多々あるかとは思いますが、これらの《新・複素数》が
我々に一体どんな未知なる映像(フラクタル画像)を見せてくれるのかの一点ではないでしょうか
これを見ているみなさんも独自の《新・複素数》を定義してマンデルブロー、ジュリア集合、
ニュートンフラクタル等を描かせると、まだ誰も見たことがない映像(フラクタル画像)が
見られるのではないでしょうか
Re: 複素数クッキング
- しばっち
2026/08/11 (Tue) 08:24:02
※「禁止ワード」という単語に阻まれてそれがどれなのか分からずプログラムの一部を削除しました。
アットマークはプログラム中にはないのでその他のワードが原因と思われます。
結局どの文字が原因なのかもわかりません。
詳しい情報をお願いします。
Re: 複素数クッキング
- SHIRAISHI Kazuo
2026/08/11 (Tue) 09:11:05
シグナルの英語綴りが禁止ワードらしいことを把握していますが,禁止ワードのリストが公開されていないので,試行錯誤で調べるしかないのが現状です。
マンデルブロート - しばっち
2026/07/19 (Sun) 07:50:19
ポテンシャル関数による描画
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR K=1 TO KMAX
LET Z=Z^N+A
IF ABS(Z)>2 THEN
LET COL=(N-LOG(LOG(ABS(Z)))/LOG(2))*8
SET POINT COLOR MAX(1,MIN(COL,255))
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END
Re: マンデルブロート - しばっち
2026/07/19 (Sun) 07:51:54
軌道トラップによる描画
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
LET MINDIST=1E+8
FOR K=1 TO KMAX
LET Z=Z^N+A
LET MINDIST=MIN(MINDIST,ABS(Z))
IF ABS(Z)>2 THEN
LET COL=INT(255*(1-MINDIST))
SET POINT COLOR MAX(0,MIN(COL,255))
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END
Re: マンデルブロート - しばっち
2026/07/19 (Sun) 07:53:09
Zの距離を利用したもの
FOR I=0 TO 7
SET COLOR MIX(I) BITAND(I,2)/2,BITAND(I,4)/4,BITAND(I,1)
NEXT I
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
LET DZ=1
FOR K=1 TO KMAX
LET Z=Z^N+A
LET DZ=N*Z^(N-1)*DZ
IF ABS(Z)>2 THEN
LET R=ABS(Z)
LET DR=ABS(DZ)
IF DR=0 THEN
LET COL=0
ELSE
LET D=R*LOG(R)/DR
LET COL=INT(D*200)
END IF
SET POINT COLOR MAX(0,MIN(COL,255))
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END
Re: マンデルブロート - しばっち
2026/07/19 (Sun) 07:54:37
マンデルブロートの着色法には繰り返し数以外にもある。
下記プログラムはZの偏角を利用している。
SET COLOR MIX(0) 0,0,0
SET COLOR MODE "NATIVE"
CLEAR
LET XS=-2
LET YS=-2
LET XE=2
LET YE=2
SET WINDOW XS,XE,YE,YS
SET POINT STYLE 1
ASK BITMAP SIZE XSIZE,YSIZE
LET KMAX=50
LET N=2
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
LET A=COMPLEX(WORLDX(X),WORLDY(Y))
LET Z=0
FOR K=1 TO KMAX
LET Z=Z^N+A
IF ABS(Z)>2 THEN
LET H=MOD(DEG(ANGLE(RE(Z),IM(Z)))+360,360)
CALL HSV2RGB(RR,GG,BB,H,255,255)
SET COLOR COLORINDEX(RR/255,GG/255,BB/255)
PLOT POINTS :WORLDX(X),WORLDY(Y)
EXIT FOR
END IF
NEXT K
NEXT X
NEXT Y
END
EXTERNAL SUB HSV2RGB(R,G,B,H,S,V)
IF S=0 THEN
LET R=V
LET G=V
LET B=V
EXIT SUB
END IF
LET T=V-S*V/255
LET HH=H
IF H>=300 OR H<60 THEN
IF H>=300 THEN LET HH=360-HH
IF H<60 THEN LET HH=-HH
LET HH=HH/60
LET RR=0
IF HH<0 THEN
LET BB=1
LET GG=HH+BB
ELSE
LET GG=1
LET BB=GG-HH
END IF
ELSEIF H>=60 AND H<180 THEN
LET HH=HH-120
LET HH=HH/60
LET GG=0
IF HH<0 THEN
LET BB=1
LET RR=HH+BB
ELSE
LET RR=1
LET BB=RR-HH
END IF
ELSEIF H>=180 AND H<300 THEN
LET HH=HH-240
LET HH=HH/60
LET BB=0
IF HH<0 THEN
LET RR=1
LET GG=HH+RR
ELSE
LET GG=1
LET RR=GG-HH
END IF
END IF
LET R=-RR*(V-T)+V
LET R=INT(R)
LET G=-GG*(V-T)+V
LET G=INT(G)
LET B=-BB*(V-T)+V
LET B=INT(B)
END SUB
Re: マンデルブロート - knoike
2026/07/20 (Mon) 06:21:54
本題からは離れた余談なのですが、「Mandelbrot」の t は発音せず、「マンデルブロ(マンデルブロー)」と読みます。
「ballet(バレエ)」とか、
「depot(デポ)」とか、
「buffet(ビュッフェ)」などと同じです。
Re: マンデルブロート
- しばっち
2026/08/11 (Tue) 07:37:58
日本語では以下のように表記・発音されるようです。
マンデルブロ (フランス語圏での発音に近く、辞書などでも一般的です)
マンデルブロー (英語圏での発音や、ネット上での表記でよく使われます)
マンデルブロート (ドイツ語風の表記です)
ネット上ではマンデルブロ、マンデルブローと表記されているものが多いようです。
ブノワ・マンデルブロ本人はブヌワ・マンデルブロットと発音していたようです。
Windowsで音を出力する - SHIRAISHI Kazuo
2026/07/30 (Thu) 16:24:42
https://decimalbasic.web.fc2.com/QA-WAV.htm(WAVファイルを作成する・読む)
の手法で音を作成することができますが,Windows APIを利用してファイルを介さずに音が出せるはずなので試しました。
次に示すのは32ビット版です。Ver.7,Ver.8とBASICAccで動作します。
1秒当たり44100個の波形データを配列に用意し,WaveOutを実行します。
波形データの数値は-1以上,1以下でなければなりません。
音を変えたいとき変更が必要なのは,1050~1120行の部分です。
波形データのうち,最初の1000個(約22.7ミリ秒分)をグラフで表示します。絶対値が1を超えないように管理してください。
倍音の位相を変えると波形が変わるのに,人の耳には同じ音に聞こえることなどが確かめられます。
1000 OPTION ARITHMETIC native
1010 OPTION CHARACTER BYTE
1020 DECLARE EXTERNAL SUB SoundMono.Waveout
1030 DECLARE EXTERNAL NUMERIC SoundMono.SAMPLE_RATE
1040 DECLARE NUMERIC wlen
1050 LET wlen=SAMPLE_RATE * 1.5 ! SAMPLE_RATE × 秒数
1060 DIM w(wlen)
1070 DECLARE NUMERIC i,t,f
1080 LET f=175 ! 基音(Hz)
1090 FOR i=1 TO wlen
1100 LET t=i/SAMPLE_RATE
1110 LET w(i)=0.5*SIN(2*PI*f*t) + 0.1*SIN(2*PI*2*f*t) + 0.3*SIN(2*PI*3*f*t) + 0.1*SIN(2*PI*5*f*t)
1120 NEXT i
1130 CALL WaveOut(w)
1140 END
10000 REM 音声波出力 32ビットWindows版
10010 MODULE SoundMono
10020 MODULE OPTION ARITHMETIC native
10030 MODULE OPTION CHARACTER byte
10035 PUBLIC SUB WaveOut
10040 SHARE SUB DeviceOpen
10050 SHARE SUB DeviceClose
10060 SHARE SUB WaveOut0
10070 PUBLIC NUMERIC SAMPLE_RATE
10080 LET SAMPLE_RATE = 44100 ! サンプリング周波数 (44.1kHz)
10090 SHARE NUMERIC BufferLength
10100 SHARE NUMERIC hWaveOut ! Audio device ハンドル
10110 SHARE STRING Buffer1$
10120 SHARE STRING header1$
10130 SHARE NUMERIC SizeOfWAVEHDR
10140 LET SizeOfWAVEHDR=4*8 ! 64bit Windowsでは要修正
10150 EXTERNAL SUB WaveOut(w())
10160 SET WINDOW 0,1000,-2,2
10170 DRAW grid(10,1) WITH SCALE(SAMPLE_RATE/1000,1)
10180 DECLARE NUMERIC i
10190 FOR i=1 TO 1000
10200 PLOT POINTS:i,w(i)
10210 NEXT i
10220 DECLARE NUMERIC wlen
10230 LET wlen=UBOUND(w)
10240 CALL DeviceOpen(wlen)
10250 CALL WaveOut0(w)
10260 CALL DeviceClose
10270 END SUB
10280 EXTERNAL SUB DeviceOpen(BufLen)
10290 ! wave format 16bit, モノラル
10300 LET BufferLength=BufLen
10310 DECLARE NUMERIC wFormatTag, nChannels, nSamplesPerSec, wBitsPerSample, nBlockAlign, nAvgBytesPerSec, cbsize
10320 DECLARE STRING wfx$ ! wave format struct tWAVEFORMATEX
10330 LET wFormatTag = 1 ! WAVE_FORMAT_PCM;
10340 LET nChannels = 1 ! モノラル
10350 LET nSamplesPerSec = SAMPLE_RATE
10360 LET wBitsPerSample = 16
10370 LET nBlockAlign = (nChannels * wBitsPerSample) / 8
10380 LET nAvgBytesPerSec = nSamplesPerSec * nBlockAlign
10390 LET cbsize=0
10400 LET wfx$=word$(wFormatTag) & WoRD$(nChannels) & DWORD$(nSamplesPerSec) & DWORD$(nAvgBytesPerSec) & WORD$(nBlockAlign) & WORD$(wBitsPerSample) & WORD$(cbSize)
10410 ! オーディオデバイスのオープン
10420 FUNCTION waveOutOpen(lphWaveOut$, uDeviceID , lpFormat$, ByVal, dwInstance , dwFlags)
10430 assign "winmm.dll" ,"waveOutOpen"
10440 END FUNCTION
10450 DECLARE STRING hWaveOut$
10460 LET hWaveOut$=REPEAT$(CHR$(0),4)
10470 IF waveOutOpen(hWaveOut$, -1, wfx$, 0, 0, 0) <>0 THEN
10480 PRINT "オーディオデバイスを開けませんでした。"
10490 STOP
10500 END IF
10510 DECLARE EXTERNAL FUNCTION VarPtr, DWord
10520 LET hWaveOut=DWord(hWaveOut$,0)
10530 DECLARE NUMERIC header1_lpData, dwBufferLength
10540 !typedef struct wavehdr_tag {
10550 ! LPSTR lpData;
10560 ! DWORD dwBufferLength;
10570 ! DWORD dwBytesRecorded;
10580 ! DWORD_PTR dwUser;
10590 ! DWORD dwFlags;
10600 ! DWORD dwLoops;
10610 ! struct wavehdr_tag *lpNext;
10620 ! DWORD_PTR reserved;
10630 !} WAVEHDR, *PWAVEHDR, *NPWAVEHDR, *LPWAVEHDR;
10640 LET buffer1$=REPEAT$(CHR$(0),2*BufferLength)
10650 LET header1$=REPEAT$(CHR$(0),SizeOfWAVEHDR)
10660 LET header1_lpData = VarPtr(buffer1$)
10670 LET dwBufferLength = BufferLength * 2
10680 LET header1$(1:4)=Dword$(header1_lpData)
10690 LET header1$(5:8)=DWord$(dwBufferLength)
10700 SUB waveOutPrepareHeader( hWaveOut, lpWaveOutHdr$ , uSize )
10710 assign "winmm.dll" , "waveOutPrepareHeader"
10720 END SUB
10730 CALL waveOutPrepareHeader(hWaveOut, header1$, SizeOfWAVEHDR)
10740 END SUB
10750 EXTERNAL SUB DeviceClose
10760 SUB waveOutReset(hWaveOut)
10770 assign "winmm.dll" ,"waveOutReset"
10780 END SUB
10790 SUB waveOutUnprepareHeader( hWaveOut, lpWaveOutHdr$ , uSize )
10800 assign "winmm.dll" , "waveOutUnprepareHeader"
10810 END SUB
10820 SUB waveOutClose(hWaveOut)
10830 assign "winmm.dll" ,"waveOutClose"
10840 END SUB
10850 CALL waveOutReset(hWaveOut)
10860 CALL waveOutUnprepareHeader(hWaveOut, header1$, SizeOfWAVEHDR)
10870 call waveOutClose(hWaveOut)
10880 END SUB
10890 EXTERNAL SUB WaveOut0(w())
10900 SUB waveOutWrite(hWaveOut, header$, SizeOfWAVEHDR)
10910 assign "winmm.dll" ,"waveOutWrite"
10920 END SUB
10930 DECLARE NUMERIC i
10940 FOR i=1 TO BufferLength
10950 LET buffer1$(i*2-1: i*2) = WORD$(32767*w(i))
10960 NEXT i
10970 CALL waveOutWrite(hWaveOut, header1$, SizeOfWAVEHDR)
10980 DECLARE NUMERIC WHDR_DONE
10990 DECLARE EXTERNAL FUNCTION DWord
11000 LET WHDR_DONE=1
11010 DO WHILE BITAND(Dword(header1$,16), WHDR_DONE)=0 !header1$(16:19)はdwFlags
11020 WAIT DELAY 0.01
11030 LOOP
11040 END SUB
11050 END MODULE
11060 EXTERNAL FUNCTION VarPtr(s$)
11070 OPTION ARITHMETIC NATIVE
11080 OPTION CHARACTER byte
11090 FUNCTION CharPrev(s$,t$)
11100 ASSIGN "user32.dll","CharPrevA"
11110 END FUNCTION
11120 LET VarPtr=CharPrev(s$,s$)
11130 END FUNCTION
11140 EXTERNAL FUNCTION DWord(s$,p)
11150 OPTION ARITHMETIC NATIVE
11160 OPTION CHARACTER byte
11170 DECLARE NUMERIC n, i
11180 LET n=0
11190 FOR i=1 TO 4
11200 LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
11210 NEXT i
11220 LET Dword=n
11230 END FUNCTION
Windows APIで音を出すのはかなり面倒です。
まず,waveOutOpen
https://learn.microsoft.com/ja-jp/windows/win32/api/mmeapi/nf-mmeapi-waveoutopen
を実行してオーディオデバイスのハンドルを取得します(10470行)。
次に,waveOutPrepareHeader
https://learn.microsoft.com/ja-jp/windows/win32/api/mmeapi/nf-mmeapi-waveoutprepareheader
を実行して,波形データを置く領域を指定します(10730行)。
実際の波形データ(16ビット)はBuffer1$に置くのですが,それが,Header1$を介して間接的に指定されます。
そして,waveOutWrite
https://learn.microsoft.com/ja-jp/windows/win32/api/mmeapi/nf-mmeapi-waveoutwrite
を実行して音を出します(10970行)。
そして,11010行に示すようにヘッダのdwFlagsのWHDR_DONEビットが1になるのを待ちます(演奏終了)。
Re: Windowsで音を出力する - SHIRAISHI Kazuo
2026/07/30 (Thu) 16:50:19
64ビット版です。Ver.0.9.4.4とBASICAccで動作します。Ver.0.9.4.3では動作しません。
1000 OPTION ARITHMETIC native
1010 OPTION CHARACTER BYTE
1020 DECLARE EXTERNAL SUB SoundMono.Waveout
1030 DECLARE EXTERNAL NUMERIC SoundMono.SAMPLE_RATE
1040 DECLARE NUMERIC wlen
1050 LET wlen=SAMPLE_RATE * 1.5 ! SAMPLE_RATE × 秒数
1060 DIM w(wlen)
1070 DECLARE NUMERIC i,t,f
1080 LET f=175 ! 基音(Hz)
1090 FOR i=1 TO wlen
1100 LET t=i/SAMPLE_RATE
1110 LET w(i)=0.2*SIN(2*PI*f*t) + 0.4*SIN(2*PI*2*f*t) + 0.1*SIN(2*PI*4*f*t) + 0.1*SIN(2*PI*6*f*t)
1120 NEXT i
1130 CALL WaveOut(w)
1140 PRINT "終了"
1150 END
10000 REM 音声波出力 64ビットWindows版
10010 MODULE SoundMono
10020 MODULE OPTION ARITHMETIC native
10030 MODULE OPTION CHARACTER byte
10035 PUBLIC SUB WaveOut
10040 SHARE SUB DeviceOpen
10050 SHARE SUB DeviceClose
10060 SHARE SUB WaveOut0
10070 PUBLIC NUMERIC SAMPLE_RATE
10080 LET SAMPLE_RATE = 44100 ! サンプリング周波数 (44.1kHz)
10090 SHARE NUMERIC BufferLength
10100 SHARE NUMERIC hWaveOut ! Audio device ハンドル
10110 SHARE STRING Buffer1$
10120 SHARE STRING header1$
10130 SHARE NUMERIC SizeOfWAVEHDR
10140 LET SizeOfWAVEHDR = 8+4+4+8+4+4+8+8 ! 64bit Windows
10150 EXTERNAL SUB WaveOut(w())
10160 SET WINDOW 0,1000,-2,2
10170 DRAW grid(10,1) WITH SCALE(SAMPLE_RATE/1000,1)
10180 DECLARE NUMERIC i
10190 FOR i=1 TO 1000
10200 PLOT POINTS:i,w(i)
10210 NEXT i
10220 DECLARE NUMERIC wlen
10230 LET wlen=UBOUND(w)
10240 CALL DeviceOpen(wlen)
10250 CALL WaveOut0(w)
10260 CALL DeviceClose
10270 END SUB
10280 EXTERNAL SUB DeviceOpen(BufLen)
10290 ! wave format 16bit, モノラル
10300 LET BufferLength=BufLen
10310 DECLARE NUMERIC wFormatTag, nChannels, nSamplesPerSec, wBitsPerSample, nBlockAlign, nAvgBytesPerSec, cbsize
10320 DECLARE STRING wfx$ ! wave format struct tWAVEFORMATEX
10330 LET wFormatTag = 1 ! WAVE_FORMAT_PCM;
10340 LET nChannels = 1 ! モノラル
10350 LET nSamplesPerSec = SAMPLE_RATE
10360 LET wBitsPerSample = 16
10370 LET nBlockAlign = (nChannels * wBitsPerSample) / 8
10380 LET nAvgBytesPerSec = nSamplesPerSec * nBlockAlign
10390 LET cbsize=0
10400 LET wfx$=word$(wFormatTag) & WoRD$(nChannels) & DWORD$(nSamplesPerSec) & DWORD$(nAvgBytesPerSec) & WORD$(nBlockAlign) & WORD$(wBitsPerSample) & WORD$(cbSize)
10410 ! オーディオデバイスのオープン
10420 FUNCTION waveOutOpen(lphWaveOut$, uDeviceID , lpFormat$, ByVal, dwInstance , dwFlags)
10430 assign "winmm.dll" ,"waveOutOpen"
10440 END FUNCTION
10450 DECLARE STRING hWaveOut$
10460 DECLARE NUMERIC testval
10470 LET hWaveOut$=REPEAT$(CHR$(0),8)
10480 LET testval =waveOutOpen(hWaveOut$, -1, wfx$, 0, 0, 0)
10490 IF testval<>0 THEN
10500 PRINT testval,"オーディオデバイスを開けませんでした。"
10510 STOP
10520 END IF
10530 DECLARE EXTERNAL FUNCTION VarPtr, QWord, QWord$
10540 LET hWaveOut=QWord(hWaveOut$,0)
10550 DECLARE NUMERIC header1_lpData, dwBufferLength
10560 !typedef struct wavehdr_tag {
10570 ! LPSTR lpData;
10580 ! DWORD dwBufferLength;
10590 ! DWORD dwBytesRecorded;
10600 ! DWORD_PTR dwUser;
10610 ! DWORD dwFlags;
10620 ! DWORD dwLoops;
10630 ! struct wavehdr_tag *lpNext;
10640 ! DWORD_PTR reserved;
10650 !} WAVEHDR, *PWAVEHDR, *NPWAVEHDR, *LPWAVEHDR;
10660 LET buffer1$=REPEAT$(CHR$(0),2*BufferLength)
10670 LET header1$=REPEAT$(CHR$(0),SizeOfWAVEHDR)
10680 LET header1_lpData = VarPtr(buffer1$)
10690 LET dwBufferLength = BufferLength * 2
10700 LET header1$(1:8)=Qword$(header1_lpData)
10710 LET header1$(9:12)=DWord$(dwBufferLength)
10720 SUB waveOutPrepareHeader( hWaveOut, lpWaveOutHdr$ , uSize )
10730 assign "winmm.dll" , "waveOutPrepareHeader"
10740 END SUB
10750 CALL waveOutPrepareHeader(hWaveOut, header1$, SizeOfWAVEHDR)
10760 END SUB
10770 EXTERNAL SUB DeviceClose
10780 SUB waveOutReset(hWaveOut)
10790 assign "winmm.dll" ,"waveOutReset"
10800 END SUB
10810 SUB waveOutUnprepareHeader( hWaveOut, lpWaveOutHdr$ , uSize )
10820 assign "winmm.dll" , "waveOutUnprepareHeader"
10830 END SUB
10840 SUB waveOutClose(hWaveOut)
10850 assign "winmm.dll" ,"waveOutClose"
10860 END SUB
10870 CALL waveOutReset(hWaveOut)
10880 CALL waveOutUnprepareHeader(hWaveOut, header1$, SizeOfWAVEHDR)
10890 call waveOutClose(hWaveOut)
10900 END SUB
10910 EXTERNAL SUB WaveOut0(w())
10920 SUB waveOutWrite(hWaveOut, header$, SizeOfWAVEHDR)
10930 assign "winmm.dll" ,"waveOutWrite"
10940 END SUB
10950 DECLARE NUMERIC i
10960 FOR i=1 TO BufferLength
10970 LET buffer1$(i*2-1: i*2) = WORD$(32767*w(i))
10980 NEXT i
10990 CALL waveOutWrite(hWaveOut, header1$, SizeOfWAVEHDR)
11000 DECLARE NUMERIC WHDR_DONE
11010 DECLARE EXTERNAL FUNCTION DWord
11020 LET WHDR_DONE=1
11030 DO WHILE BITAND(DWord(header1$,24), WHDR_DONE)=0 !header1$(24:27)はdwFlags
11040 WAIT DELAY 0.01
11050 LOOP
11060 END SUB
11070 END MODULE
11080 EXTERNAL FUNCTION VarPtr(s$)
11090 OPTION ARITHMETIC NATIVE
11100 OPTION CHARACTER byte
11110 FUNCTION CharPrev(s$,t$)
11120 ASSIGN "user32.dll","CharPrevA"
11130 END FUNCTION
11140 LET VarPtr=CharPrev(s$,s$)
11150 END FUNCTION
11160 EXTERNAL FUNCTION DWord(s$,p)
11170 OPTION ARITHMETIC NATIVE
11180 OPTION CHARACTER byte
11190 DECLARE NUMERIC n, i
11200 LET n=0
11210 FOR i=1 TO 4
11220 LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
11230 NEXT i
11240 LET Dword=n
11250 END FUNCTION
11260 EXTERNAL FUNCTION QWord(s$,p)
11270 OPTION ARITHMETIC NATIVE
11280 OPTION CHARACTER byte
11290 DECLARE NUMERIC n, i
11300 LET n=0
11310 FOR i=1 TO 8
11320 LET n=n+256^(i-1)*ORD(s$(p+i:p+i))
11330 NEXT i
11340 LET Qword=n
11350 END FUNCTION
11360 EXTERNAL FUNCTION QWORD$(n)
11370 OPTION CHARACTER BYTE
11380 DECLARE NUMERIC r
11390 DECLARE STRING s$
11400 LET r=MOD(n,2^8)
11410 LET s$=CHR$(r)
11420 LET n=(n-r)/2^8
11430 LET r=MOD(n,2^8)
11440 LET s$=s$ & CHR$(r)
11450 LET n=(n-r)/2^8
11460 LET r=MOD(n,2^8)
11470 LET s$=s$ & CHR$(r)
11480 LET n=(n-r)/2^8
11490 LET r=MOD(n,2^8)
11500 LET s$=s$ & CHR$(r)
11510 LET n=(n-r)/2^8
11520 LET r=MOD(n,2^8)
11530 LET s$=s$ & CHR$(r)
11540 LET n=(n-r)/2^8
11550 LET r=MOD(n,2^8)
11560 LET s$=s$ & CHR$(r)
11570 LET n=(n-r)/2^8
11580 LET r=MOD(n,2^8)
11590 LET s$=s$ & CHR$(r)
11600 LET n=(n-r)/2^8
11610 LET r=MOD(n,2^8)
11620 LET QWORD$=s$ & CHR$(r)
11630 END FUNCTION
Windows APIを利用する上で難しいのが,11030行で利用しているWHDR_DONEなどの定数の実際の数値です。
最近はGoogleに尋ねれば大方解決するようになって大分助かっています。
あと難しいのは構造体の実際の配置です。隙間なく埋まっている場合は計算できますが,そうなっていないこともあるので難しいです(情報が足りない)。
Re: Windowsで音を出力する - knoike
2026/08/01 (Sat) 07:50:43
白石先生
> Windows APIを利用する上で難しいのが,11030行で利用しているWHDR_DONEなどの定数の実際の数値です。
> あと難しいのは構造体の実際の配置です。隙間なく埋まっている場合は計算できますが,そうなっていないこともあるので難しいです(情報が足りない)。
どちらも、Visual C++ をインストールして、それらが定義されているヘッダファイルを探して読めばよいのですが、個人的にはまったくおすすめできません。
白石先生も承知していると思いますが、危ないからです。
また、構造体のメンバのバイトオーダーやアライメントはヘッダファイルを読んでもわからず、コンパイラの振る舞いを想定しておく必要があります。
Win32API を直に使うことは、可能ではあるけれど非推奨、とするほうがよいのではないでしょうか。
ご投稿の主旨が変わってしまいますが、
.dll, .so を作って Win/mac/Linux 共通の関数インターフェースで拡張する方法を解説し、
それを推奨する方針のほうがよいのではないでしょうか。
Windows 環境用に .dll の作り方や使い方、
RPi 環境用に .so の使い方が書かれた情報は存在しますが、
たぶん、これらだけでは macOS 環境の方や Linux 環境の方はわからない(伝わらない)と思います。
「(仮称)十進BASICで自作DLLを使う」
https://decimalbasic.web.fc2.com/MakeDLL.htm
「Win32 APIとDLLの利用」
https://decimalbasic.web.fc2.com/ExtDLL.htm
「Raspberry PiのGPIOを操作する」
https://decimalbasic.web.fc2.com/GPIO_RaspberryPi.htm
「Raspberry Pi GPIO」
https://deimal-basic.bbs.fc2.com/?act=reply&tid=8920538
Re: Windowsで音を出力する - knoike
2026/08/01 (Sat) 08:23:58
どちらの投稿へのリプライにするか迷いましたが、こちらにしておきます。
「Win32 API を使うための情報源」
https://deimal-basic.bbs.fc2.com/?act=reply&tid=8957149
この↑白石先生のご投稿とも関係がありますが、新し目の Visual C++ をインストールしてヘッダファイルを読んだほうが確実です。
実際の手順は、こんな感じ↓です。
Visual C++ を起動し、[ツール] → [コマンドライン] で、「開発者コマンドプロンプト」を起動する。
Windows API のヘッダファイルファイルのあるフォルダへ cd する。
「
C:\Users\kenzi\source\repos>where $include:windows.h
C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\Windows.h
C:\Users\kenzi\source\repos>cd C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um\
」
定数 WHDR_DONE の値を調べる。
「
C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um>findstr /S /N WHDR_DONE *.h
mmeapi.h:92:#define WHDR_DONE 0x00000001 /* done bit */
」
構造体 wavehdr_tag(WAVEHDR)の定義を調べる。
「
C:\Program Files (x86)\Windows Kits\10\Include\10.0.26100.0\um>findstr /S /N wavehdr *.h
mmeapi.h:80:typedef struct wavehdr_tag {
mmeapi.h:87: struct wavehdr_tag FAR *lpNext; /* reserved for driver */
」
→
mmeapi.h の 80行目あたりだとわかるので、Visual C++ で mmeapi.h を開いて wavehdr で検索してそのあたりを見る。
→
「
/* wave data block header */
typedef struct wavehdr_tag {
LPSTR lpData; /* pointer to locked data buffer */
DWORD dwBufferLength; /* length of data buffer */
DWORD dwBytesRecorded; /* used for input only */
DWORD_PTR dwUser; /* for client's use */
DWORD dwFlags; /* assorted flags (see defines) */
DWORD dwLoops; /* loop control counter */
struct wavehdr_tag FAR *lpNext; /* reserved for driver */
DWORD_PTR reserved; /* reserved for driver */
} WAVEHDR, *PWAVEHDR, NEAR *NPWAVEHDR, FAR *LPWAVEHDR;
」
くどいようですが、10進BASIC から Win32API を直に使うのは、私は非推奨にしたほうがよいと思います。
.dll, .so 経由で使うことを推奨したほうがよいと思います。
Re: Windowsで音を出力する - SHIRAISHI Kazuo
2026/08/03 (Mon) 07:06:42
DLLを自分で作るような人は別ですが,素性が不明なDLLを使うのは,Win32 APIを使うよりさらに多難です。
Win32 APiのほうが仕様が明確で,確実に使えます。
難しいのは,その仕様を効率よく調べる手段が提供されていないからです(普通の人はヘッダファイルを探索するなんてやりたいと思わない)。
Re: Windowsで音を出力する - knoike
2026/08/04 (Tue) 01:28:11
素性が不明な Webページを紹介するくらいだったら、
公式サイトからの情報の探し方を教えてあげてください。
そのほうが、仕様が明確にわかり、最新の情報なので確実に使えます。
Google検索を使うのは公式情報のありかを探すためだけに使いましょう。
白石先生がここ↓で紹介している Webページだって、
https://deimal-basic.bbs.fc2.com/?act=reply&tid=8957149
素性が不明の人が GitHub上の公式情報をクロールしているだけのことです。
それとも、このページを生成している人は白石先生のお知り合いで、
悪さを絶対にしないことが確実に言える人なのですか?
素性だの確実性だのを気にするのであれば、
元をあたりましょうよ、元を。
> まず,waveOutOpen
> https://learn.microsoft.com/ja-jp/windows/win32/api/mmeapi/nf-mmeapi-waveoutopen
> を実行してオーディオデバイスのハンドルを取得します(10470行)。
こんな感じで、公式情報の読み方や探し方を教えてあげてください。
そのほうが確実で、あとで白石先生自身が楽をできます。
あるいは、「公式情報は難しくて読みこなせない」という人向けには、
「ChatGPTなどの対話系の生成AIに訊く」ということを教えてあげてください。
わからないことは次々と訊けば答えてくれるので、
API の使い方や仕様など、あっという間に理解できます。
確実性を担保したいのであれば、そのあとで公式サイトで確認するように伝えておくとよいです。
ChatGPT でなく Claude(Codeは使わない)でもよいです。
> 難しいのは,その仕様を効率よく調べる手段が提供されていないからです
そこがよくわかりません。
Web検索だけでなんとかすることに固執せず、
「ChatGPTなどの対話系の生成AIに訊く」
でよいと思います。いわゆる「普通の人」ならなおさらです。
> (普通の人はヘッダファイルを探索するなんてやりたいと思わない)。
ちょっと Win32API を使ってみたいだけの人ならそうでしょうが、
効率だの確実性だのを望むのであれば、
・公式サイトを検索する
・ローカルでヘッダファイルを検索する
のが圧倒的に効率がよく、しかも確実です。
"探索" なんてしません。findstr で "検索" するだけです。
即座に確実な情報が見つかります。
また、Web検索と違ってゴミ情報を掴まされることが絶対にありません。
Re: Windowsで音を出力する - knoike
2026/08/04 (Tue) 01:40:59
> 素性が不明なDLLを使うのは,Win32 APIを使うよりさらに多難です。
Win32API を呼ぶための Wrapper DLL を、公式が正式に用意する、
という方法もありますが、
かける労力の割にはあまり報われないでしょうね。
そもそも、Wrapper 経由だと、すべての API は使えないです。
ということで、やはり「使用可能だけれども非推奨」にしておいたほうがよいと思います。
白石先生の実装を読んでいませんが、
引数のチェックなどをせずに、素通しで渡してしまっているのではないでしょうか。
Wrapper 経由ならそのチェックができ、問われる責任をある程度回避できます。
無責任に Win32API を直に使わせるのとはかなり違います。
Re: Windowsで音を出力する - knoike
2026/08/04 (Tue) 02:42:42
話は逸れますが、
WASAPI で音を出すことは 10進BASIC からできそうでしょうか。
白石先生が書いたコードは、MME です。
Re: Windowsで音を出力する - SHIRAISHI Kazuo
2026/08/04 (Tue) 19:27:54
Win32 APIを利用する機能(ASSIGN文)は,Full BASICの機能だけでカバーできない部分(ファイル操作・ディレクトリ操作など)を外部に委譲することを目的として,
WIN32 APIの呼び出し規約に準拠するように用意したものです。
なので,ターゲットはWin32 APIです。CDECのDLLは,使えてしまうこともありますが,本来,対象外です(Ver.7 のとき)。
最近のバージョンではファイルやディレクトリ操作などが独自拡張機能でできるようになっているのでWin32 APIの出番はなくなっていますが,
Windowsの機能のすべてを取り込んでいるわけではないので,Win32 APIが不要になったわけではありません。
残す目的は,十進BASICの言語仕様の範囲でできないことを実現することです。
ただし,Win32 APIのすべてが使えるわけではありません。CallBack関数を要求される場合には,うまく対応できないこともあります。
ASSIGN文でできることは,数値型の引数を32ビット整数として評価して渡すことと,文字列型のとき,1文字目へのポインタ(空文字列のときはnul)を渡すことだけです。
数値型変数を参照渡しにすることはできず,浮動小数点数を渡すこともできません。
内部構造が他の多くのシステム開発言語と大きく異なるので,システム開発言語のような感覚でWin32 APIを使うことはできません。
Re: Windowsで音を出力する - knoike
2026/08/09 (Sun) 06:56:41
> 文字列型のとき,1文字目へのポインタ(空文字列のときはnul)を渡す
「素通しにしておらず、アドレス範囲のチェックをしてある」ということでしょうか。
つまり、セキュリティホールになることはない、ということでしょうか。
うーん、ここを見るようになってからまだ日が浅いせいもあり、
いま一歩、白石先生の考える十進BASICのポリシーがわからないので教えてください。
その説明だと、やはり、Win32 API を使うことは「非推奨」なのではないでしょうか。
非常手段として用意してあるだけのことで。
たとえば、「ファイルを介さずにサウンド出力をする」のは、
現時点では公式に(拡張)機能として用意できていないだけのことで、
本来は一般ユーザーに Win32 API を直に使わせる案件ではないのではないでしょうか。
> Win32 APIが不要になったわけではありません
たとえば、どんなことをするために一般ユーザーが Win32 API を直に使う必要があるのでしょうか。
.dll/.dylib/.so を読み込んで使えるようにする機能をなくせ、と言っているわけでは
ありません。この機能自体はあったほうがよいと思います。
たとえば、どこかに AquesTalk の .dll を読み込んで音声合成をさせる例がありましたが、
機能を拡張するために必要な機能です。
私が言語設計者だったら、
何かの処理を Win32 API を使ってしのぐ例を紹介するときは必ず、
「Win32 API を直に使う方法は非推奨です。
可能であれば .dll 化し、ソースコードとともに公開してください」
と添えます。
余談:
いま気づいたのですが、"Win32API" は、昔と違っていまの時代は "Win32 API" と
空白文字で区切るのですね。
公式がそういう変更をするのはナシだなぁ... 。
"DirectX" や "WASAPI" も、そのうち "Dirext X" や "WAS API" に変わるのだろうか... 。
Re: Windowsで音を出力する - SHIRAISHI Kazuo
2026/08/09 (Sun) 08:54:42
十進BASICはシステム開発言語ではありません。しかし,Full BASIC言語仕様でカバーできないことが実行できないのは不便です。
十進BASIC Ver.7のDLL呼び出しはWin32 APIの仕様に合わせてあります。だから「Win32 API非推奨」はありえません。
DLL呼び出しは使い方を間違えると危険です。試行錯誤で使えるものではありません。DLL呼び出しには慎重さが必要です。
Win32 APIは,仕様が明確です。正しく使う限り,期待した通りに動作します。その意味で,Win32 APIで簡単に実現できることにはWin32 APIを使うことが推奨できます。
ただし,Win32 APIはパラメータが多くてそれらの意味を理解するのは容易ではなく,また,使うのにも面倒な手順が必要です。
Win32 APIを使わずに済むのであれば,使わずに済ませたいのは確かです。
Re: Windowsで音を出力する - knoike
2026/08/09 (Sun) 09:40:09
白石先生、次回以降から書き込むときには、
ほどほどの文字数で改行してください。
ブラウザ端で見切れた書き込みを読み出すのが少々手間です。
> CDECのDLLは,使えてしまうこともありますが,
念のために確認しますが、
"CDEC" は "cdecl" のことですよね?
要は対象としているのは cdecl ではなく stdcall ですよ、
ということですよね。
呼び出し側が stdcall を想定して cdecl の .dll 内関数を使うと、
その場では動くでしょうけれど、呼び出すたびにスタックポインタが
ずれていって、あるとき唐突に問題が発生しそう... 。
かといって、呼び出し側で、呼び出される .dll が stdcall かそれ以外かを
確実に判定する方法はなさそうですね。
経験的に「たぶん stdcall だろう」と判断することはできそうですけれど、
不確実な方法です。
それはそうとして、いま、調べていて知ったのですが、
64bit Windows 環境だと、この種の違いがなくなって
問題が起こらなくなったのですね。
cdecl や stdcall などの呼び出し方法の違いは、
「Microsoft x64 calling convention」なる名称の
呼び出し方に統一され、吸収されたのだそうです。
Re: Windowsで音を出力する - knoike
2026/08/09 (Sun) 10:13:51
1/
> > 文字列型のとき,1文字目へのポインタ(空文字列のときはnul)を渡す
>
> 「素通しにしておらず、アドレス範囲のチェックをしてある」ということでしょうか。
> つまり、セキュリティホールになることはない、ということでしょうか。
2/
> たとえば、「ファイルを介さずにサウンド出力をする」のは、
> 現時点では公式に(拡張)機能として用意できていないだけのことで、
> 本来は一般ユーザーに Win32 API を直に使わせる案件ではないのではないでしょうか。
3/
> たとえば、どんなことをするために一般ユーザーが Win32 API を直に使う必要があるのでしょうか。
白石先生、(可能であれば)この 3つの質問に答えてください。
> 十進BASICはシステム開発言語ではありません。しかし,Full BASIC言語仕様でカバーできないことが実行できないのは不便です。
> 十進BASIC Ver.7のDLL呼び出しはWin32 APIの仕様に合わせてあります。だから「Win32 API非推奨」はありえません。
> DLL呼び出しは使い方を間違えると危険です。試行錯誤で使えるものではありません。DLL呼び出しには慎重さが必要です。
> Win32 APIは,仕様が明確です。正しく使う限り,期待した通りに動作します。その意味で,Win32 APIで簡単に実現できることにはWin32 APIを使うことが推奨できます。
> ただし,Win32 APIはパラメータが多くてそれらの意味を理解するのは容易ではなく,また,使うのにも面倒な手順が必要です。
> Win32 APIを使わずに済むのであれば,使わずに済ませたいのは確かです。
読みましたが、この説明であれば、私の感覚だと、
ますます一般ユーザーに対しては「非推奨」です。
「使えるようにしてある」ことと、「それを使うことが推奨されるかどうか」は別の話です。
> 十進BASIC Ver.7のDLL呼び出しはWin32 APIの仕様に合わせてあります。だから「Win32 API非推奨」はありえません。
ここは、"だから" では論理的につながりません。
「~の仕様に合わせてあります。でも危険なので、~を使うことは非推奨です。」
とも言えるでしょう?
しかも、白石先生の想定しているユーザーは、
「Visual C++ をインストールしていない、させたくもない。
Web検索だけでなんとかしようとしている」
というユーザーだったはずです。
「Win32 API は、使えるようにはしてあるけれど、
生半可な知識では使わないでね。つまり、非推奨です。」
これでいいと思うのですがー。
お互いに「自分のほうが状況にあった適切な事柄を提案している」と
思い込んでいるので、論理的に折り合いがつかなそうですね。
ただ、この場は白石先生の場ですので、なるべくなら、私のほうが引くことで終わりたいです。
Re: Windowsで音を出力する - SHIRAISHI Kazuo
2026/08/09 (Sun) 10:35:55
32ビットWindowsだと,C言語ではcdeclが普通で,Win32 APIはstdcallです。
十進BASIC Ver.7 が対応しているのはstdcallです。
ただし,ASSIGN文の実行途中でDelphiの例外処理try~except~endを使っているためか,DLLがスタックポインタを元に戻さないときには元に戻されてしまい,意図した通りには動作しません。
でも,結果的に,cdeclのDLLでも動くことになります。だから,cdeclのDLLは動くかもしれないけれど,非推奨です。
64ビットWindowsだとMicrosoft x64 calling conventionで統一されて厄介な問題は減っているのですが,Linuxなど他のOSとの互換性がない点が面倒です(使う側はあまり気にしなくてよい)。
Win32 API を使うための情報源 - SHIRAISHI Kazuo
2026/07/31 (Fri) 17:08:47
Win32 APIが使う定数の値や,構造体内での配置を知ることができるサイトを見つけました。
https://docs.hsp.moe/Win32API/
ここの情報を使えば,Cなどで書かれたサンプルの移植が楽になりそうです。
Re: Win32 API を使うための情報源 - knoike
2026/08/09 (Sun) 07:44:03
https://deimal-basic.bbs.fc2.com/?act=reply&tid=8957003
白石先生と意見が分かれているのですが、
C などで書かれた Win32 API を直に使うプログラムを
十進BASICに移植するような方は、
Visual C++ をインストールしておいたほうがよいと思います。
定数の値や構造体のメンバ情報などを知りたければ、
「開発者コマンドプロンプト」で
findstr で検索すると即座に確実な情報が得られます。
(findstr するためのディレクトリは、where コマンドで即座にわかります。)
移植中には、移植元の C のプログラムを試しに実行する必要に
迫られると思いますが、
そのときにも、Visual C++ がインストールされていれば、
コンパイルして動かすことができます(できるかもしれません)。
これは、移植先が十進BASICである場合に限った話ではないと思います。
移植元のプログラムの開発言語(環境)が無料で入手できる場合は、
入手しておいたほうが何かと楽になると思います。
Re: Win32 API を使うための情報源 - knoike
2026/08/09 (Sun) 08:10:26
https://docs.hsp.moe/Win32API/
白石先生が紹介しているこの Webページ、
確かに整理されていて読みやすいとは思いますが、
Microsoftの従業員ではない人による
2次情報であることには留意しておいたほうがよいかもしれません。
それと、用意されている検索システムに少々クセがあり、
たとえば、"WHDR_DONE" は "DONE" では挙がってきません。
"whdr" なら挙がってきます。
検索の仕方やリンクのたどり方に慣れる必要があると思います。
なお、1次情報は、その Webページにも書いてあるとおりで、
GitHub 中の Microsoft公式アカウント下にあるリポジトリのひとつです。
https://github.com/microsoft/win32metadata
ただ、「C などで書かれた Win32 API を直に使うプログラムを
十進BASICに移植したい」という目的の人にとっては
ここから情報を探すのは大変だと思います。
白石先生が紹介している 2次情報のほうが整理されていてよいかもしれません。
今回の件とはあまり関係がありませんが、
十進BASICに限らずプログラミング全般に興味のある方は、
GitHub のアカウントは作っておいたほうがよいのではないかと思います。
無料で作れて、使い続けられます。
昔と違って、多くのプロバイダが、いわゆる「ホームページ」を作れるサービスを終了し、
「ブログ」サービスなども終了してしまった現在は、
有用な Webページがかなり減ってしまったと思います。
GitHub 中に有用な情報源(サンプルプログラムなど)が存在することもありますので、
GitHubアカウントは作っておいたほうがよいと私は思います。
SNSアカウントや、技術系コミュニティサイトのアカウントも同様です。
4次元グラフィックス - しばっち
2026/07/05 (Sun) 07:45:02
4次元グラフィックス
https://ja.wikipedia.org/wiki/五胞体
https://ja.wikipedia.org/wiki/多胞体
ワイヤーフレームで五胞体を表示します。
平行投影で4次元→2次元としています。
また、X-Y平面を描画していますが、X-Z平面やX-W平面、Y-W平面等もあります。
OPTION ANGLE DEGREES
LET LMIN=1E+10
LET LMAX=-1E+10
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYW(4,4),ROTYZ(4,4),ROTXW(4,4),ROTZW(4,4)
DIM X(20),Y(20),Z(20),W(20),MESH(20,3)
FOR I=1 TO 5
READ X(I),Y(I),Z(I),W(I) ! 座標データ読み込み
LET XMAX=MAX(X(I),XMAX)
LET XMIN=MIN(X(I),XMIN)
LET YMAX=MAX(Y(I),YMAX)
LET YMIN=MIN(Y(I),YMIN)
LET ZMAX=MAX(Z(I),ZMAX)
LET ZMIN=MIN(Z(I),ZMIN)
LET WMAX=MAX(W(I),WMAX)
LET WMIN=MIN(W(I),WMIN)
NEXT I
DATA 0,0,0,1
DATA -0.559017,0.559017,0.559017,-0.25
DATA 0.559017,-0.559017,0.559017,-0.25
DATA 0.559017,0.559017,-0.559017,-0.25
DATA -0.559017,-0.559017,-0.559017,-0.25
DO
READ IF MISSING THEN EXIT DO:N
LET NUM=NUM+1
FOR I=1 TO N
READ MESH(NUM,I) ! メッシュ読み込み
NEXT I
LOOP
DATA 3,2,3,4
DATA 3,1,3,4
DATA 3,1,2,4
DATA 3,1,2,3
DATA 3,0,3,4
DATA 3,0,2,4
DATA 3,0,2,3
DATA 3,0,1,4
DATA 3,0,1,3
DATA 3,0,1,2
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,MAX(ZMAX-ZMIN,WMAX-WMIN)))
LOCATE VALUE NOWAIT(1),RANGE 0 TO 3,AT 1:SCALE
LOCATE VALUE NOWAIT(2),RANGE -RANGE TO RANGE,AT 0:XMOVE
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0:YMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0:ZMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0:WMOVE
LOCATE VALUE NOWAIT(6),RANGE -360 TO 360,AT 0:XY
LOCATE VALUE NOWAIT(7),RANGE -360 TO 360,AT 0:XZ
LOCATE VALUE NOWAIT(8),RANGE -360 TO 360,AT 0:YW
LOCATE VALUE NOWAIT(9),RANGE -360 TO 360,AT 0:YZ
LOCATE VALUE NOWAIT(10),RANGE -360 TO 360,AT 0:XW
LOCATE VALUE NOWAIT(11),RANGE -360 TO 360,AT 0:ZW
DO
LOCATE VALUE NOWAIT(1):SCALE
LOCATE VALUE NOWAIT(2):XMOVE
LOCATE VALUE NOWAIT(3):YMOVE
LOCATE VALUE NOWAIT(4):ZMOVE
LOCATE VALUE NOWAIT(5):WMOVE
LOCATE VALUE NOWAIT(6):XY
LOCATE VALUE NOWAIT(7):XZ
LOCATE VALUE NOWAIT(8):YW
LOCATE VALUE NOWAIT(9):YZ
LOCATE VALUE NOWAIT(10):XW
LOCATE VALUE NOWAIT(11):ZW
MAT ROTXY=IDN !'XY平面上の回転(ZW平面を軸とする回転)
LET ROTXY(1,1)=COS(XY)
LET ROTXY(1,2)=SIN(XY)
LET ROTXY(2,1)=-SIN(XY)
LET ROTXY(2,2)=COS(XY)
MAT ROTXZ=IDN !'XZ平面上の回転(YW平面を軸とする回転)
LET ROTXZ(1,1)=COS(XZ)
LET ROTXZ(1,3)=-SIN(XZ)
LET ROTXZ(3,1)=SIN(XZ)
LET ROTXZ(3,3)=COS(XZ)
MAT ROTYW=IDN !'YW平面上の回転(XZ平面を軸とする回転)
LET ROTYW(2,2)=COS(YW)
LET ROTYW(2,4)=-SIN(YW)
LET ROTYW(4,2)=SIN(YW)
LET ROTYW(4,4)=COS(YW)
MAT ROTYZ=IDN !'YZ平面上の回転(XW平面を軸とする回転)
LET ROTYZ(2,2)=COS(YZ)
LET ROTYZ(2,3)=SIN(YZ)
LET ROTYZ(3,2)=-SIN(YZ)
LET ROTYZ(3,3)=COS(YZ)
MAT ROTXW=IDN !'XW平面上の回転(YZ平面を軸とする回転)
LET ROTXW(1,1)=COS(XW)
LET ROTXW(1,4)=SIN(XW)
LET ROTXW(4,1)=-SIN(XW)
LET ROTXW(4,4)=COS(XW)
MAT ROTZW=IDN !'ZW平面上の回転(XY平面を軸とする回転)
LET ROTZW(3,3)=COS(ZW)
LET ROTZW(3,4)=-SIN(ZW)
LET ROTZW(4,3)=SIN(ZW)
LET ROTZW(4,4)=COS(ZW)
MAT M=ROTXY*ROTXZ*ROTYW*ROTYZ*ROTXW*ROTZW ! 4次元回転
SET DRAW MODE HIDDEN
CLEAR
FOR I=1 TO NUM
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
CALL PLOT(X(MESH(I,2)+1),Y(MESH(I,2)+1),Z(MESH(I,2)+1),W(MESH(I,2)+1))
CALL PLOT(X(MESH(I,3)+1),Y(MESH(I,3)+1),Z(MESH(I,3)+1),W(MESH(I,3)+1))
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
PLOT LINES
NEXT I
IF FL=0 THEN
SET WINDOW -LMAX*1.2,LMAX*1.2,-LMAX*1.2,LMAX*1.2
LET FL=1
END IF
SET DRAW MODE EXPLICIT
LOOP
SUB PLOT(X,Y,Z,W)
LET LW=2
LET POINT(1)=X-XMOVE
LET POINT(2)=Y-YMOVE
LET POINT(3)=Z-ZMOVE
LET POINT(4)=W-WMOVE
MAT POINT=POINT*M
! FOR K=1 TO 3
! LET POINT(K)=POINT(K)/(LW-POINT(4))
! NEXT
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE; ! X-Y平面
END IF
END SUB
END
Re: 4次元グラフィックス - しばっち
2026/07/05 (Sun) 07:47:08
八胞体を表示します。
https://ja.wikipedia.org/wiki/正八胞体
OPTION ANGLE DEGREES
LET LMIN=1E+10
LET LMAX=-1E+10
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYW(4,4),ROTYZ(4,4),ROTXW(4,4),ROTZW(4,4)
DIM X(50),Y(50),Z(50),W(50),MESH(50,10)
FOR I=1 TO 16
READ X(I),Y(I),Z(I),W(I)
LET XMAX=MAX(X(I),XMAX)
LET XMIN=MIN(X(I),XMIN)
LET YMAX=MAX(Y(I),YMAX)
LET YMIN=MIN(Y(I),YMIN)
LET ZMAX=MAX(Z(I),ZMAX)
LET ZMIN=MIN(Z(I),ZMIN)
LET WMAX=MAX(W(I),WMAX)
LET WMIN=MIN(W(I),WMIN)
NEXT I
DATA -0.5,-0.5,-0.5,-0.5
DATA -0.5,-0.5,-0.5,0.5
DATA -0.5,-0.5,0.5,-0.5
DATA -0.5,-0.5,0.5,0.5
DATA -0.5,0.5,-0.5,-0.5
DATA -0.5,0.5,-0.5,0.5
DATA -0.5,0.5,0.5,-0.5
DATA -0.5,0.5,0.5,0.5
DATA 0.5,-0.5,-0.5,-0.5
DATA 0.5,-0.5,-0.5,0.5
DATA 0.5,-0.5,0.5,-0.5
DATA 0.5,-0.5,0.5,0.5
DATA 0.5,0.5,-0.5,-0.5
DATA 0.5,0.5,-0.5,0.5
DATA 0.5,0.5,0.5,-0.5
DATA 0.5,0.5,0.5,0.5
DO
READ IF MISSING THEN EXIT DO:N
LET NUM=NUM+1
FOR I=1 TO N
READ MESH(NUM,I)
NEXT I
LOOP
DATA 4,0,2,3,1
DATA 4,0,4,5,1
DATA 4,0,4,6,2
DATA 4,0,8,9,1
DATA 4,0,8,10,2
DATA 4,0,8,12,4
DATA 4,4,6,7,5
DATA 4,2,6,7,3
DATA 4,1,5,7,3
DATA 4,2,10,11,3
DATA 4,1,9,11,3
DATA 4,1,9,13,5
DATA 4,8,10,11,9
DATA 4,8,12,13,9
DATA 4,8,12,14,10
DATA 4,4,12,13,5
DATA 4,4,12,14,6
DATA 4,2,10,14,6
DATA 4,12,14,15,13
DATA 4,10,14,15,11
DATA 4,9,13,15,11
DATA 4,6,14,15,7
DATA 4,5,13,15,7
DATA 4,3,11,15,7
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,MAX(ZMAX-ZMIN,WMAX-WMIN)))
LOCATE VALUE NOWAIT(1),RANGE 0 TO 3,AT 1:SCALE
LOCATE VALUE NOWAIT(2),RANGE -RANGE TO RANGE,AT 0:XMOVE
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0:YMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0:ZMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0:WMOVE
LOCATE VALUE NOWAIT(6),RANGE -360 TO 360,AT 0:XY
LOCATE VALUE NOWAIT(7),RANGE -360 TO 360,AT 0:XZ
LOCATE VALUE NOWAIT(8),RANGE -360 TO 360,AT 0:YW
LOCATE VALUE NOWAIT(9),RANGE -360 TO 360,AT 0:YZ
LOCATE VALUE NOWAIT(10),RANGE -360 TO 360,AT 0:XW
LOCATE VALUE NOWAIT(11),RANGE -360 TO 360,AT 0:ZW
DO
LOCATE VALUE NOWAIT(1):SCALE
LOCATE VALUE NOWAIT(2):XMOVE
LOCATE VALUE NOWAIT(3):YMOVE
LOCATE VALUE NOWAIT(4):ZMOVE
LOCATE VALUE NOWAIT(5):WMOVE
LOCATE VALUE NOWAIT(6):XY
LOCATE VALUE NOWAIT(7):XZ
LOCATE VALUE NOWAIT(8):YW
LOCATE VALUE NOWAIT(9):YZ
LOCATE VALUE NOWAIT(10):XW
LOCATE VALUE NOWAIT(11):ZW
MAT ROTXY=IDN !'XY平面上の回転(ZW平面を軸とする回転)
LET ROTXY(1,1)=COS(XY)
LET ROTXY(1,2)=SIN(XY)
LET ROTXY(2,1)=-SIN(XY)
LET ROTXY(2,2)=COS(XY)
MAT ROTXZ=IDN !'XZ平面上の回転(YW平面を軸とする回転)
LET ROTXZ(1,1)=COS(XZ)
LET ROTXZ(1,3)=-SIN(XZ)
LET ROTXZ(3,1)=SIN(XZ)
LET ROTXZ(3,3)=COS(XZ)
MAT ROTYW=IDN !'YW平面上の回転(XZ平面を軸とする回転)
LET ROTYW(2,2)=COS(YW)
LET ROTYW(2,4)=-SIN(YW)
LET ROTYW(4,2)=SIN(YW)
LET ROTYW(4,4)=COS(YW)
MAT ROTYZ=IDN !'YZ平面上の回転(XW平面を軸とする回転)
LET ROTYZ(2,2)=COS(YZ)
LET ROTYZ(2,3)=SIN(YZ)
LET ROTYZ(3,2)=-SIN(YZ)
LET ROTYZ(3,3)=COS(YZ)
MAT ROTXW=IDN !'XW平面上の回転(YZ平面を軸とする回転)
LET ROTXW(1,1)=COS(XW)
LET ROTXW(1,4)=SIN(XW)
LET ROTXW(4,1)=-SIN(XW)
LET ROTXW(4,4)=COS(XW)
MAT ROTZW=IDN !'ZW平面上の回転(XY平面を軸とする回転)
LET ROTZW(3,3)=COS(ZW)
LET ROTZW(3,4)=-SIN(ZW)
LET ROTZW(4,3)=SIN(ZW)
LET ROTZW(4,4)=COS(ZW)
MAT M=ROTXY*ROTXZ*ROTYW*ROTYZ*ROTXW*ROTZW ! 4次元回転
SET DRAW MODE HIDDEN
CLEAR
FOR I=1 TO NUM
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
CALL PLOT(X(MESH(I,2)+1),Y(MESH(I,2)+1),Z(MESH(I,2)+1),W(MESH(I,2)+1))
CALL PLOT(X(MESH(I,3)+1),Y(MESH(I,3)+1),Z(MESH(I,3)+1),W(MESH(I,3)+1))
CALL PLOT(X(MESH(I,4)+1),Y(MESH(I,4)+1),Z(MESH(I,4)+1),W(MESH(I,4)+1))
CALL PLOT(X(MESH(I,1)+1),Y(MESH(I,1)+1),Z(MESH(I,1)+1),W(MESH(I,1)+1))
PLOT LINES
NEXT I
IF FL=0 THEN
SET WINDOW -LMAX*1.2,LMAX*1.2,-LMAX*1.2,LMAX*1.2
LET FL=1
END IF
SET DRAW MODE EXPLICIT
LOOP
SUB PLOT(X,Y,Z,W)
LET LW=2
LET POINT(1)=X-XMOVE
LET POINT(2)=Y-YMOVE
LET POINT(3)=Z-ZMOVE
LET POINT(4)=W-WMOVE
MAT POINT=POINT*M
! FOR K=1 TO 3
! LET POINT(K)=POINT(K)/(LW-POINT(4))
! NEXT
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE;
END IF
END SUB
END
Re: 4次元グラフィックス - しばっち
2026/07/05 (Sun) 07:48:22
十六胞体
https://ja.wikipedia.org/wiki/正十六胞体
以下データのみ
DATA -1,0,0,0
DATA 0,-1,0,0
DATA 0,0,-1,0
DATA 0,0,0,-1
DATA 1,0,0,0
DATA 0,1,0,0
DATA 0,0,1,0
DATA 0,0,0,1
DATA 3,5,6,7
DATA 3,4,6,7
DATA 3,4,5,7
DATA 3,4,5,6
DATA 3,0,6,7
DATA 3,0,5,7
DATA 3,0,5,6
DATA 3,1,6,7
DATA 3,1,4,7
DATA 3,1,4,6
DATA 3,0,1,7
DATA 3,0,1,6
DATA 3,2,5,7
DATA 3,2,4,7
DATA 3,2,4,5
DATA 3,0,2,7
DATA 3,0,2,5
DATA 3,1,2,7
DATA 3,1,2,4
DATA 3,0,1,2
DATA 3,3,5,6
DATA 3,3,4,6
DATA 3,3,4,5
DATA 3,0,3,6
DATA 3,0,3,5
DATA 3,1,3,6
DATA 3,1,3,4
DATA 3,0,1,3
DATA 3,2,3,5
DATA 3,2,3,4
DATA 3,0,2,3
DATA 3,1,2,3
Re: 4次元グラフィックス - しばっち
2026/07/05 (Sun) 07:49:44
二十四胞体
https://ja.wikipedia.org/wiki/正二十四胞体
以下データのみ
DATA -1,0,0,0
DATA 0,-1,0,0
DATA 0,0,-1,0
DATA 0,0,0,-1
DATA 1,0,0,0
DATA 0,1,0,0
DATA 0,0,1,0
DATA 0,0,0,1
DATA -0.5,-0.5,-0.5,-0.5
DATA -0.5,-0.5,-0.5,0.5
DATA -0.5,-0.5,0.5,-0.5
DATA -0.5,-0.5,0.5,0.5
DATA -0.5,0.5,-0.5,-0.5
DATA -0.5,0.5,-0.5,0.5
DATA -0.5,0.5,0.5,-0.5
DATA -0.5,0.5,0.5,0.5
DATA 0.5,-0.5,-0.5,-0.5
DATA 0.5,-0.5,-0.5,0.5
DATA 0.5,-0.5,0.5,-0.5
DATA 0.5,-0.5,0.5,0.5
DATA 0.5,0.5,-0.5,-0.5
DATA 0.5,0.5,-0.5,0.5
DATA 0.5,0.5,0.5,-0.5
DATA 0.5,0.5,0.5,0.5
DATA 3,0,8,9
DATA 3,0,8,10
DATA 3,1,8,9
DATA 3,1,8,10
DATA 3,0,10,11
DATA 3,0,9,11
DATA 3,1,10,11
DATA 3,1,9,11
DATA 3,0,8,12
DATA 3,2,8,9
DATA 3,2,8,12
DATA 3,0,12,13
DATA 3,0,9,13
DATA 3,2,9,13
DATA 3,2,12,13
DATA 3,3,8,10
DATA 3,3,8,12
DATA 3,0,12,14
DATA 3,0,10,14
DATA 3,3,12,14
DATA 3,3,10,14
DATA 3,1,8,16
DATA 3,2,8,16
DATA 3,1,9,17
DATA 3,2,9,17
DATA 3,1,16,17
DATA 3,2,16,17
DATA 3,3,8,16
DATA 3,1,10,18
DATA 3,1,16,18
DATA 3,3,16,18
DATA 3,3,10,18
DATA 3,2,16,20
DATA 3,3,16,20
DATA 3,2,12,20
DATA 3,3,12,20
DATA 3,0,14,15
DATA 3,0,13,15
DATA 3,5,12,13
DATA 3,5,12,14
DATA 3,5,14,15
DATA 3,5,13,15
DATA 3,0,11,15
DATA 3,6,10,11
DATA 3,6,10,14
DATA 3,6,14,15
DATA 3,6,11,15
DATA 3,7,9,11
DATA 3,7,9,13
DATA 3,7,13,15
DATA 3,7,11,15
DATA 3,1,11,19
DATA 3,1,18,19
DATA 3,6,10,18
DATA 3,6,18,19
DATA 3,6,11,19
DATA 3,7,9,17
DATA 3,1,17,19
DATA 3,7,17,19
DATA 3,7,11,19
DATA 3,2,17,21
DATA 3,2,13,21
DATA 3,7,17,21
DATA 3,7,13,21
DATA 3,4,16,17
DATA 3,4,16,18
DATA 3,4,18,19
DATA 3,4,17,19
DATA 3,4,16,20
DATA 3,2,20,21
DATA 3,4,20,21
DATA 3,4,17,21
DATA 3,3,20,22
DATA 3,3,18,22
DATA 3,4,20,22
DATA 3,4,18,22
DATA 3,5,12,20
DATA 3,5,20,21
DATA 3,5,13,21
DATA 3,3,14,22
DATA 3,5,20,22
DATA 3,5,14,22
DATA 3,6,18,22
DATA 3,6,14,22
DATA 3,4,22,23
DATA 3,4,21,23
DATA 3,5,22,23
DATA 3,5,21,23
DATA 3,4,19,23
DATA 3,6,22,23
DATA 3,6,19,23
DATA 3,7,21,23
DATA 3,7,19,23
DATA 3,5,15,23
DATA 3,6,15,23
DATA 3,7,15,23
Re: 4次元グラフィックス - しばっち
2026/07/05 (Sun) 07:51:04
4次元トーラス
OPTION ANGLE DEGREES
LET LMIN=1E+10
LET LMAX=-1E+10
LET NN=40 !'分割数
LET MM=40
DIM M(4,4),POINT(4),ROTXY(4,4),ROTXZ(4,4),ROTYU(4,4),ROTYZ(4,4),ROTXU(4,4),ROTZU(4,4)
DIM XX(0 TO NN,0 TO MM),YY(0 TO NN,0 TO MM),ZZ(0 TO NN,0 TO MM),WW(0 TO NN,0 TO MM)
SET POINT STYLE 1
FOR J=0 TO MM
FOR I=0 TO NN
LET ALPHA=I*360/NN
LET BETA=J*360/MM
LET XX(I,J)=COS(ALPHA)
LET YY(I,J)=SIN(ALPHA)
LET ZZ(I,J)=COS(BETA)
LET WW(I,J)=SIN(BETA)
LET XMIN=MIN(XMIN,XX(I,J))
LET XMAX=MAX(XMAX,XX(I,J))
LET YMIN=MIN(YMIN,YY(I,J))
LET YMAX=MAX(YMAX,YY(I,J))
LET ZMIN=MIN(ZMIN,ZZ(I,J))
LET ZMAX=MAX(ZMAX,ZZ(I,J))
LET WMIN=MIN(WMIN,WW(I,J))
LET WMAX=MAX(WMAX,WW(I,J))
NEXT I
NEXT J
LET RANGE=MAX(XMAX-XMIN,MAX(YMAX-YMIN,MAX(ZMAX-ZMIN,WMAX-WMIN)))
LOCATE VALUE NOWAIT(1),RANGE 0 TO 3,AT 1:SCALE
LOCATE VALUE NOWAIT(2),RANGE -RANGE TO RANGE,AT 0:XMOVE
LOCATE VALUE NOWAIT(3),RANGE -RANGE TO RANGE,AT 0:YMOVE
LOCATE VALUE NOWAIT(4),RANGE -RANGE TO RANGE,AT 0:ZMOVE
LOCATE VALUE NOWAIT(5),RANGE -RANGE TO RANGE,AT 0:WMOVE
LOCATE VALUE NOWAIT(6),RANGE -360 TO 360,AT 0:XY
LOCATE VALUE NOWAIT(7),RANGE -360 TO 360,AT 0:XZ
LOCATE VALUE NOWAIT(8),RANGE -360 TO 360,AT 0:YU
LOCATE VALUE NOWAIT(9),RANGE -360 TO 360,AT 0:YZ
LOCATE VALUE NOWAIT(10),RANGE -360 TO 360,AT 0:XU
LOCATE VALUE NOWAIT(11),RANGE -360 TO 360,AT 0:ZU
DO
LOCATE VALUE NOWAIT(1):SCALE
LOCATE VALUE NOWAIT(2):XMOVE
LOCATE VALUE NOWAIT(3):YMOVE
LOCATE VALUE NOWAIT(4):ZMOVE
LOCATE VALUE NOWAIT(5):WMOVE
LOCATE VALUE NOWAIT(6):XY
LOCATE VALUE NOWAIT(7):XZ
LOCATE VALUE NOWAIT(8):YU
LOCATE VALUE NOWAIT(9):YZ
LOCATE VALUE NOWAIT(10):XU
LOCATE VALUE NOWAIT(11):ZU
MAT ROTXY=IDN !'XY平面上の回転(ZU平面を軸とする回転)
LET ROTXY(1,1)=COS(XY)
LET ROTXY(1,2)=SIN(XY)
LET ROTXY(2,1)=-SIN(XY)
LET ROTXY(2,2)=COS(XY)
MAT ROTXZ=IDN !'XZ平面上の回転(YU平面を軸とする回転)
LET ROTXZ(1,1)=COS(XZ)
LET ROTXZ(1,3)=-SIN(XZ)
LET ROTXZ(3,1)=SIN(XZ)
LET ROTXZ(3,3)=COS(XZ)
MAT ROTYU=IDN !'YU平面上の回転(XZ平面を軸とする回転)
LET ROTYU(2,2)=COS(YU)
LET ROTYU(2,4)=-SIN(YU)
LET ROTYU(4,2)=SIN(YU)
LET ROTYU(4,4)=COS(YU)
MAT ROTYZ=IDN !'YZ平面上の回転(XU平面を軸とする回転)
LET ROTYZ(2,2)=COS(YZ)
LET ROTYZ(2,3)=SIN(YZ)
LET ROTYZ(3,2)=-SIN(YZ)
LET ROTYZ(3,3)=COS(YZ)
MAT ROTXU=IDN !'XU平面上の回転(YZ平面を軸とする回転)
LET ROTXU(1,1)=COS(XU)
LET ROTXU(1,4)=SIN(XU)
LET ROTXU(4,1)=-SIN(XU)
LET ROTXU(4,4)=COS(XU)
MAT ROTZU=IDN !'ZU平面上の回転(XY平面を軸とする回転)
LET ROTZU(3,3)=COS(ZU)
LET ROTZU(3,4)=-SIN(ZU)
LET ROTZU(4,3)=SIN(ZU)
LET ROTZU(4,4)=COS(ZU)
MAT M=ROTXY*ROTXZ*ROTYU*ROTYZ*ROTXU*ROTZU
SET DRAW MODE HIDDEN
CLEAR
FOR J=0 TO MM-1
FOR I=0 TO NN-1
CALL PLOT(XX(I,J),YY(I,J),ZZ(I,J),WW(I,J))
CALL PLOT(XX(I,J+1),YY(I,J+1),ZZ(I,J+1),WW(I,J+1))
CALL PLOT(XX(I+1,J+1),YY(I+1,J+1),ZZ(I+1,J+1),WW(I+1,J+1))
CALL PLOT(XX(I+1,J),YY(I+1,J),ZZ(I+1,J),WW(I+1,J))
CALL PLOT(XX(I,J),YY(I,J),ZZ(I,J),WW(I,J))
PLOT LINES
NEXT I
NEXT J
IF FL=0 THEN
SET WINDOW -LMAX*1.2,LMAX*1.2,-LMAX*1.2,LMAX*1.2
LET FL=1
END IF
SET DRAW MODE EXPLICIT
LOOP
SUB PLOT(X,Y,Z,W)
LET LW=2
LET POINT(1)=X-XMOVE
LET POINT(2)=Y-YMOVE
LET POINT(3)=Z-ZMOVE
LET POINT(4)=W-WMOVE
MAT POINT=POINT*M
! FOR K=1 TO 3
! LET POINT(K)=POINT(K)/(LW-POINT(4))
! NEXT
IF FL=0 THEN
LET LMIN=MIN(LMIN,POINT(1))
LET LMAX=MAX(LMAX,POINT(1))
LET LMIN=MIN(LMIN,POINT(2))
LET LMAX=MAX(LMAX,POINT(2))
ELSE
PLOT LINES:POINT(1)*SCALE,POINT(2)*SCALE;
END IF
END SUB
END
カラーパズルゲーム - しばっち
2026/06/14 (Sun) 07:36:50
マウスでマスをクリックするとその行と列の色が変わります。(黒→白→黄色→水色→緑→紫→赤→青→黒)
全てのマスを黒にすればクリアです。
シャッフル回数を入れるとゲーム開始です。
Rキーでリトライ(リスタート)します。
Gキーはギブアップで解答を表示して終わります。
DECLARE FUNCTION CHECK
RANDOMIZE
CALL GINIT(600,600)
SET TEXT JUSTIFY "CENTER","HALF"
SET TEXT BACKGROUND "OPAQUE"
LET SIZE=3
DIM M(SIZE,SIZE),T(SIZE,SIZE),XS(100),YS(100)
CALL DISPLAY
INPUT PROMPT "シャッフル回数(5-100)=":NN
FOR K=1 TO NN
LET X=INT(RND*SIZE+1)
LET Y=INT(RND*SIZE+1)
CALL CHANGE(X,Y,1)
LET XS(K)=X
LET YS(K)=Y
CALL DISPLAY
WAIT DELAY .1
NEXT K
MAT T=M
DO
DO
MOUSE POLL MX,MY,LEFT,RIGHT
IF GETKEYSTATE(ORD("R"))<0 OR GETKEYSTATE(ORD("r"))<0 THEN ! リトライ(リスタート)
MAT M=T
CALL DISPLAY
END IF
IF GETKEYSTATE(ORD("G"))<0 OR GETKEYSTATE(ORD("g"))<0 THEN ! ギブアップ
MAT M=T
CALL DISPLAY
FOR K=NN TO 1 STEP -1 ! 解答表示
CALL CHANGE(XS(K),YS(K),-1)
CALL DISPLAY
WAIT DELAY .5
NEXT K
SET TEXT HEIGHT 60
SET TEXT BACKGROUND "TRANSPARENT"
SET TEXT COLOR 2
PLOT TEXT ,AT 300,300:"Game Over!!"
STOP
END IF
LOOP UNTIL LEFT=1 OR RIGHT=1
DO
MOUSE POLL MX,MY,LEFT,RIGHT
LOOP WHILE LEFT=1 OR RIGHT=1
LET X=INT(MX/(600/SIZE))+1
LET Y=INT(MY/(600/SIZE))+1
CALL CHANGE(X,Y,-1)
CALL DISPLAY
LOOP UNTIL CHECK=1
SET TEXT HEIGHT 60
SET TEXT BACKGROUND "TRANSPARENT"
SET TEXT COLOR 2
PLOT TEXT ,AT 300,300:"Congratulations"
SUB DISPLAY ! 画面表示
FOR J=1 TO SIZE
FOR I=1 TO SIZE
CALL BOXFULL(600/SIZE*(I-1),600/SIZE*(J-1),600/SIZE*I,600/SIZE*J,M(I,J))
NEXT I
NEXT J
END SUB
FUNCTION CHECK ! 揃ったか?
FOR J=1 TO SIZE
FOR I=1 TO SIZE
IF M(I,J)<>0 THEN
LET CHECK=0
EXIT FUNCTION
END IF
NEXT I
NEXT J
LET CHECK=1
END FUNCTION
SUB CHANGE(X,Y,SIGN)
LET M(X,Y)=M(X,Y)+SIGN
IF M(X,Y)>7 THEN LET M(X,Y)=0
IF M(X,Y)<0 THEN LET M(X,Y)=7
FOR I=1 TO SIZE
IF I<>Y THEN LET M(X,I)=M(X,I)+SIGN
IF M(X,I)>7 THEN LET M(X,I)=0
IF M(X,I)<0 THEN LET M(X,I)=7
NEXT I
FOR I=1 TO SIZE
IF I<>X THEN LET M(I,Y)=M(I,Y)+SIGN
IF M(I,Y)>7 THEN LET M(I,Y)=0
IF M(I,Y)<0 THEN LET M(I,Y)=7
NEXT I
END SUB
END
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
EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET AREA COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB
PLOT LINESの使い方 - 島村1243
2026/06/02 (Tue) 07:42:57
下記のコードで三角(鋸り)波の表示をしたいのですが、wt=PIのときの縦垂直線がずれてしまいます。
何処にコード誤記が有るのかが分からず困っています。
初歩のお尋ねで申し訳ありませんがご教示頂けると有り難いです。
SET WINDOW -0.1*PI,2.1*PI,-1.5,1.5
DRAW grid(PI/2,0.5)
LET nMax=100
LET dwt=2*PI/nMax
FOR k=0 TO nMax
LET wt=k*dwt
IF wt<PI THEN PLOT LINES:wt,wt/PI;
IF wt=PI THEN !---縦垂直線の処理
PLOT LINES:wt,1;
PLOT LINES:wt,0;
END IF
IF wt>PI THEN PLOT LINES:wt,(wt-PI)/PI;
NEXT K
PLOT LINES
END
Re: PLOT LINESの使い方 - SHIRAISHI Kazuo
2026/06/02 (Tue) 08:06:12
LET nMax=100
LET dwt=2*PI/nMax
FOR k=0 TO nMax
LET wt=k*dwt
PRINT k, wt-PI
NEXT K
END
を実行してみるとわかりますが,wt=PIになることがないのが原因のような気がします。
wtの値で分類するのでなく,kの値で分類すればうまくいくと思います。
(補足)
組込関数PIは16桁を超える精度を持っていますが,数値変数wtは15桁の精度で丸められます。
具体的には,PI=3.141592653589793238ですが,
k=50のとき,wt=3.1415926535898です。
だから,k=50のとき,wt>PIです。
Re: PLOT LINESの使い方 - 島村1243
2026/06/02 (Tue) 10:38:53
SHRAISHI先生、早速のご教示有難う御座いました。
ご教示に従って、For Next を下記の様に修正したら、目的を達成できました!!!
FOR k=0 TO nMax
LET wt=k*dwt
IF k<nMax/2 THEN PLOT LINES:wt,wt/PI;
IF k=nMax/2 THEN !---縦垂直線の処理
PLOT LINES:wt,1;
PLOT LINES:wt,0;
END IF
IF k>nMax/2 THEN PLOT LINES:wt,(wt-PI)/PI;
NEXT K
文字探しゲーム - しばっち
2026/05/31 (Sun) 07:40:57
文字探しゲーム
文字の中からマウスで「デ」と「レ」を探しだすゲームです。
全部見つけたと思ったら「完了」をクリックすると判定されます。
すばやく見つけて間違えず見過ごさないことが試されます。
RANDOMIZE
DIM A$(100),M$(50,50)
FOR I=1 TO 3
READ D$
FOR J=1 TO LEN(D$)
LET K=K+1
LET A$(K)=MID$(D$,J,1)
NEXT J
NEXT I
CALL GINIT(600,600)
LET H=40
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
SET TEXT HEIGHT H*.8
DATA "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲン"
DATA "ガギグゲゴザジズゼゾダヂヅデドバビブベボ"
DATA "パピプペポデレデレデレデレデレデレ"
FOR Y=0 TO 400 STEP H
FOR X=0 TO 600 STEP H
LET S$=A$(INT(RND*K)+1)
LET M$(X/H+1,Y/H+1)=S$
PLOT TEXT,AT X,Y:S$
NEXT X
NEXT Y
CALL BOX(450,500,450+H*2,550,7)
PLOT TEXT,AT 450,500:"完了"
LET T=TIME
DO
SET TEXT COLOR 7
SET TEXT BACKGROUND "OPAQUE"
PLOT TEXT,AT 30,450:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 30,500:"SCORE "&USING$("%%%",HIT)
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP UNTIL RIGHT=1 OR LEFT=1
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP WHILE RIGHT=1 OR LEFT=1
IF X>450 AND X<530 AND Y>500 AND Y<550 THEN
FOR I=1 TO INT(600/H)
FOR J=1 TO INT((400+H)/H)
IF M$(I,J)="デ" OR M$(I,J)="レ" THEN
SET TEXT COLOR 4
PLOT TEXT ,AT (I-1)*H,(J-1)*H:M$(I,J)
LET MISS=MISS+1
END IF
NEXT J
NEXT I
SET TEXT COLOR 7
PLOT TEXT,AT 30,450:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 30,500:"SCORE "&USING$("%%%",HIT)
PLOT TEXT,AT 30,550:"TIME "&USING$("%%",INT((TIME-T)/60)) &":"&USING$("%%",MOD(INT(TIME-T),60))
STOP
END IF
LET XX=INT(X/H)
LET YY=INT(Y/H)
IF M$(XX+1,YY+1)="デ" OR M$(XX+1,YY+1)="レ" THEN
SET TEXT COLOR 0
PLOT TEXT,AT XX*H,YY*H:M$(INT(X/H)+1,INT(Y/H)+1)
LET M$(INT(X/H)+1,INT(Y/H)+1)=""
LET HIT=HIT+1
ELSE
SET TEXT COLOR 2
PLOT TEXT,AT XX*H,YY*H:M$(INT(X/H)+1,INT(Y/H)+1)
LET M$(INT(X/H)+1,INT(Y/H)+1)=""
LET MISS=MISS+1
END IF
LOOP
END
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"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
SET COLOR MIX(8) 58/255,110/255,165/255
SET COLOR MIX(9) 212/255,208/255,200/255
CLEAR
END SUB
EXTERNAL SUB LINE(XS,YS,XE,YE,C)
SET COLOR C
PLOT LINES
PLOT LINES:XS,YS;XE,YE
END SUB
EXTERNAL SUB BOX(XS,YS,XE,YE,C)
CALL LINE(XS,YS,XE,YS,C)
CALL LINE(XE,YS,XE,YE,C)
CALL LINE(XE,YE,XS,YE,C)
CALL LINE(XS,YE,XS,YS,C)
END SUB
Re: 文字探しゲーム - しばっち
2026/05/31 (Sun) 07:42:41
指定された文字を探し出しクリックします。
全部見つけたと思ったら「完了」をクリックすると判定されます。
難易度を上げる為に回転文字や反転文字等も含まれています。
OPTION ANGLE DEGREES
RANDOMIZE
LET COL=15
LET ROW=10
DIM A$(200),M$(COL,ROW),R(COL,ROW),MOJI$(5),SX(COL,ROW),SY(COL,ROW)
DO
READ IF MISSING THEN EXIT DO:D$
FOR J=1 TO LEN(D$)
LET K=K+1
LET A$(K)=MID$(D$,J,1)
NEXT J
LOOP
CALL GINIT(600,600)
LET N=INT(RND*4+2)
FOR I=1 TO N
LET MOJI$(I)=A$(RND*K+1)
NEXT I
DATA "あいうえおかがきぎくぐけげこごさざしじすずせぜそぞただちぢつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもやゆよらりるれろわゐゑをん"
DATA "アイウヴエオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモヤユヨラリルレロワヰヱヲン"
LET H=80
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
SET TEXT HEIGHT H*.8
FOR I=0 TO N-1
PLOT TEXT ,AT 50+100*I,500:MOJI$(I+1)
NEXT I
LET H=MIN(600/COL,600/ROW)
SET TEXT HEIGHT H*.8
PLOT TEXT ,AT 50,200:"を探してください"
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP UNTIL RIGHT=1 OR LEFT=1
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP WHILE RIGHT=1 OR LEFT=1
CLEAR
SET TEXT JUSTIFY "CENTER","HALF"
FOR J=0 TO ROW-1
FOR I=0 TO COL-1
IF RND<.4 THEN LET S$=MOJI$(INT(RND*N)+1) ELSE LET S$=A$(INT(RND*K)+1)
LET M$(I+1,J+1)=S$
LET R(I+1,J+1)=90*INT(RND*4)
LET SX(I+1,J+1)=(-1)^INT(2*RND)
LET SY(I+1,J+1)=(-1)^INT(2*RND)
DRAW WORD(S$) WITH ROTATE(R(I+1,J+1))*SCALE(SX(I+1,J+1),SY(I+1,J+1))*SHIFT(H/2+I*H,H/2+J*H+200)
NEXT I
NEXT J
SET TEXT JUSTIFY "LEFT","TOP"
CALL BOX(450,100,450+H*2,50,7)
PLOT TEXT,AT 450,100:"完了"
SET TEXT BACKGROUND "OPAQUE"
LET T=TIME
DO
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
PLOT TEXT,AT 0,100:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 0,50:"SCORE "&USING$("%%%",HIT)
SET TEXT JUSTIFY "CENTER","HALF"
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP UNTIL RIGHT=1 OR LEFT=1
DO
MOUSE POLL X,Y,LEFT,RIGHT
LOOP WHILE RIGHT=1 OR LEFT=1
IF X>450 AND X<530 AND Y>50 AND Y<100 THEN ! 完了をクリックしたら
FOR J=0 TO ROW-1
FOR I=0 TO COL-1
FOR L=1 TO N
IF M$(I+1,J+1)=MOJI$(L) THEN
SET TEXT COLOR 4
DRAW WORD(M$(I+1,J+1)) WITH ROTATE(R(I+1,J+1))*SCALE(SX(I+1,J+1),SY(I+1,J+1))*SHIFT(H/2+I*H,H/2+200+J*H)
LET MISS=MISS+1
END IF
NEXT L
NEXT I
NEXT J
SET TEXT JUSTIFY "LEFT","TOP"
SET TEXT COLOR 7
PLOT TEXT,AT 0,150:"TIME "&USING$("%%",INT((TIME-T)/60)) &":"&USING$("%%",MOD(INT(TIME-T),60))
PLOT TEXT,AT 0,100:"MISS "&USING$("%%%",MISS)
PLOT TEXT,AT 0,50:"SCORE "&USING$("%%%",HIT)
STOP
END IF
LET XX=INT(X/H)
LET YY=INT((Y-200)/H)
LET FL=0
FOR L=1 TO N
IF M$(XX+1,YY+1)=MOJI$(L) THEN LET FL=1
NEXT L
IF FL=1 THEN
SET TEXT COLOR 0
DRAW WORD(M$(XX+1,YY+1)) WITH ROTATE(R(XX+1,YY+1))*SCALE(SX(XX+1,YY+1),SY(XX+1,YY+1))*SHIFT(H/2+XX*H,200+H/2+YY*H)
LET M$(XX+1,YY+1)=""
LET HIT=HIT+1
ELSE
SET TEXT COLOR 2
DRAW WORD(M$(XX+1,YY+1)) WITH ROTATE(R(XX+1,YY+1))*SCALE(SX(XX+1,YY+1),SY(XX+1,YY+1))*SHIFT(H/2+XX*H,200+H/2+YY*H)
LET M$(XX+1,YY+1)=""
LET MISS=MISS+1
END IF
LOOP
END
EXTERNAL SUB GINIT(XSIZE,YSIZE)
SET BITMAP SIZE XSIZE,YSIZE
SET WINDOW 0,XSIZE-1,0,YSIZE-1
SET POINT STYLE 1
SET COLOR MODE "REGULAR"
SET COLOR MIX(0) 0,0,0
SET COLOR MIX(1) 0,0,1
SET COLOR MIX(2) 1,0,0
SET COLOR MIX(3) 1,0,1
SET COLOR MIX(4) 0,1,0
SET COLOR MIX(5) 0,1,1
SET COLOR MIX(6) 1,1,0
SET COLOR MIX(7) 1,1,1
CLEAR
END SUB
EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB
EXTERNAL SUB LINE(XS,YS,XE,YE,C)
SET COLOR C
PLOT LINES
PLOT LINES:XS,YS;XE,YE
END SUB
EXTERNAL SUB BOX(XS,YS,XE,YE,C)
CALL LINE(XS,YS,XE,YS,C)
CALL LINE(XE,YS,XE,YE,C)
CALL LINE(XE,YE,XS,YE,C)
CALL LINE(XS,YE,XS,YS,C)
END SUB
EXTERNAL PICTURE WORD(A$)
PLOT LETTERS ,AT 0,0:A$
END PICTURE
三角関数値が異常です - しばっち
2026/04/12 (Sun) 07:39:59
三角関数値が異常です
WINDOWS版の十進BASIC(32ビット版) ver7880において
2進モード、複素数モードでの三角関数値が下記のように
異常な値になります。
10進モードでは問題ありませんでした。
精度不足が原因かと思われます。
LET B=15
LET X=1
FOR N=1 TO 30
PRINT N;COS(B^N*X*PI);SIN(B^N*X*PI)
NEXT N
END
実行結果
1 -1 5.38962320953407E-15
2 -1 3.8211783997405E-14
3 -1 3.45803084517843E-13
4 -1 1.97389614961345E-11
5 -1 3.41499483314141E-11
6 -1 4.23753952343313E-9
7 -.999999999999999 3.37607704638016E-8
8 -.999999999999804 6.25620846507764E-7
9 -.999999999993294 3.66226679917138E-6
10 -.999999999958069 9.15763480006557E-6
11 -.999999647873398 -8.39197879495783E-4
12 -.999538539588589 3.03761070104653E-2
13 -.999019433754421 -4.42738182337559E-2
14 -.718394338073019 .695636093819627
15 -.871013768888734 -.491258602373783
16 2.06352634360854E+19 2.06352634360854E+19
17 3.09528951541281E+20 3.09528951541281E+20
18 4.64293427311922E+21 4.64293427311922E+21
19 6.96440140967883E+22 6.96440140967883E+22
20 1.04466021145182E+24 1.04466021145182E+24
21 1.56699031717774E+25 1.56699031717774E+25
22 2.35048547576661E+26 2.35048547576661E+26
23 3.52572821364991E+27 3.52572821364991E+27
24 5.28859232047486E+28 5.28859232047486E+28
25 7.9328884807123E+29 7.9328884807123E+29
26 1.18993327210684E+31 1.18993327210684E+31
27 1.78489990816027E+32 1.78489990816027E+32
28 2.6773498622404E+33 2.6773498622404E+33
29 4.0160247933606E+34 4.0160247933606E+34
30 6.0240371900409E+35 6.0240371900409E+35
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/12 (Sun) 08:53:30
ご報告ありがとうございした。
原因は,Intel FPUのFSIN,FCOS命令をそのまま使っていたことです。
マニュアルをよく読むと,引数は -2^63 ~ 2^63 の範囲でなければならないようです。
倍精度数の精度は53ビットなので,その範囲外の数値に対して三角関数の値を求めることは無意味ですが,どう扱うのが適切か,検討します。
Re: 三角関数値が異常です - しばっち
2026/04/19 (Sun) 07:55:10
周期性があるのでMOD関数を利用すれば計算自体は可能ですが
誤差が累積していくようです
https://ja.wikipedia.org/wiki/ワイエルシュトラス関数
LET B=23
LET X=.4
FOR I=1 TO 15
LET C=B^I*PI*X
LET X=COS(C)
LET Y=COS(MOD(C,2*PI))
PRINT I;X;Y;X-Y
NEXT I
END
実行結果
1 -.809016994374948 -.809016994374948 -5.55111512312578E-16
2 .99555901481267 .995559014812675 -4.88498130835069E-15
3 -.994477987872487 -.994477987872643 1.55653268052447E-13
4 .624271813435692 .624271813462338 -2.66459077025161E-11
5 5.18260078207372E-2 .051826008312573 -4.91835808191787E-10
6 -.903399056291523 -.903399055889035 -4.02487820849728E-10
7 .47391871819713 .473919049744119 -3.31546989085219E-7
8 -.922909753831513 -.922908005104853 -1.74872665914538E-6
9 .791479622428268 .791603979074663 -1.24356646394985E-4
10 -.556013013484207 -.552670804109104 -3.34220937510299E-3
11 .999592310690031 .999339079455446 2.53231234584206E-4
12 .774903379838499 -.974661220596496 1.74956460043499
13 -.526222536776585 .960170286650366 -1.48639282342695
14 -1.9165008703538E+19 -.653643620863612 -1.9165008703538E+19
15 -1.6053747716131E+40 1 -1.6053747716131E+40
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/19 (Sun) 09:21:09
Delphi7のsin, cosは引数の絶対値が2^63を超えるとどちらも値が0になります。(十進BASIC Ver.7 はアセンブラでFSIN, FCOSを使用していました)
lazarusで用いられるFPC (Free Pascal) のsin, cosは,Intel FPUを使う環境ではintel FPUの仕様そのままでした。
十進BASIC Ver.7,Ver.8の修正版では,2πで割った余りを求めてから三角関数の値を求めることにしました。
ただし,ここでのπは,64ビット精度の拡張精度数です。倍精度より少し高精度ですが,真の値ではありません。
引数の絶対値が大きいときでも計算結果は-1~1の範囲に納まりますが,数値自体はほぼ無意味です。
BASICAccとParact BASICは,当面,手を加えずFPCの計算に委ねることにしました。
なお,2πでの剰余を精密に計算したいときは,十進1000桁モードを使用してください。十進1000桁モードだとPIは1000桁超の精度を持ちます。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/19 (Sun) 09:30:19
十進1000桁モードでの実行結果です。
OPTION ARITHMETIC DECIMAL_HIGH
LET B=15
LET X=1
FOR N=1 TO 30
PRINT N;COS(B^N*X*PI);SIN(B^N*X*PI)
NEXT N
END
1 -1 -.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000092857116
2 -1 -.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000139285674
3 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000208928511
4 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003133927665
5 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000047008914975
6 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000705133724625
7 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010577005869375
8 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000158655088040625
9 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002379826320609375
10 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000035697394809140625
11 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000535460922137109375
12 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008031913832056640625
13 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120478707480849609375
14 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001807180612212744140625
15 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027107708454675537109375
16 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000406615637747867431640625
17 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006099234566218011474609375
18 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000091488518493270172119140625
19 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001372327777399052581787109375
20 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020584916660985788726806640625
21 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000308773749914786830902099609375
22 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004631606248721802463531494140625
23 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000069474093594296325474456787109375
24 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001042111405862226673116851806640625
25 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015631671089231921290752777099609375
26 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000234475066341508702147291656494140625
27 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003517125995123063372607374847412109375
28 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000052756889926846599849707622711181640625
29 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000791353348902701594788002340667724609375
30 -1 -.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011870300233540525653181627110015869140625
この結果が物語ることは,B^N*X*PIの計算結果と,sinを計算するときに十進BASIC内部で用いるπの精度の違いです。
十進BASICサンプルプログラムのQ&A\SIN_PI.BASも参照してください。
要するに,PI自体がπの近似値であること,そして,SINの計算精度が保証される範囲自体も狭いことです。
十進1000桁モードの機械最小値を1E-1017に設定しているのも,精度保証との関係です。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/19 (Sun) 10:47:08
2進モードでのPIは,およそ3.141592653589793115999782457です。
この値を元にπの整数倍を計算していくと,10^16倍したとき,およそ-1.2ほどの誤差がでてきます。三角関数の値を求めるのには不適切な誤差です。
10進1000桁モードで計算してみてください。
OPTION ARITHMETIC Decimal_High
LET p=3.141592653589793115999782457
FOR i=0 TO 16
PRINT 10^i*p - 10^i*PI
NEXT i
END
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/19 (Sun) 14:55:24
三角関数の正確な値を求める基本は,xを2πで割った余りを正確に求めることです。
xを2*PIで割った商をq,余りをrとして,PI=π+eだとすると,
x=q*2*PI+r
PI=π+e
なので,
x=q*2*π+q*2*e+r
だから,xを2πで割った余りはq*2*e+rです。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/22 (Wed) 07:57:17
PI≒πの近似誤差を気にせず計算したいときは,度を単位に計算することが推奨できます。
OPTION ANGLE DEGREES
FOR k=50 TO 60
LET x=180*2^k
PRINT k,x,COS(x),SIN(x)
NEXT k
END
2進モードでの実行結果は
50 2.02661983231672E+17 1 0
51 4.05323966463345E+17 1 0
52 8.10647932926689E+17 1 0
53 1.62129586585338E+18 1 0
54 3.24259173170676E+18 1 0
55 6.48518346341351E+18 1 0
56 1.2970366926827E+19 1 0
57 2.59407338536541E+19 1 0
58 5.18814677073081E+19 .999390827019096 0
59 1.03762935414616E+20 .999390827019096 0
60 2.07525870829232E+20 .994521895368273 0
30度,45度など,度を単位に切りのいい数に対する三角関数の値を求めたいときはこちらが推奨できます。
2進モードだと,2^53までの整数は正確に表現できます。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/22 (Wed) 08:06:24
上のプログラムで,K=58以降でCOS(x)が1でない値になり,さらにその先まで計算していくとk=64以降で0になります。これは,十進BASICのバグ(?)です。
COS(x)=SIN(x+90)として計算しているのが原因で,x+90の計算が誤差を持つような範囲で正しい値が求まらなくなっています。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/24 (Fri) 17:24:18
https://ja.wikipedia.org/wiki/ワイエルシュトラス関数
で,
COS(b^n*x*π)を正確に計算したいのであれば,b^n*xを2で割った余りをrとおくと,COS(b^n*x*π)=COS(r*π)
0≦r<2なので,COS(r*π)をCOS(r*PI)で近似してもさほど問題ない。
OPTION ARITHMETIC NATIVE
LET a=1/2
LET b=11
FUNCTION w(x)
LET t=0
LET n=0
FOR n=200 TO 0 STEP -1
LET r=MOD(b^n*x,2)
LET t=t+a^n*COS(r*PI)
NEXT n
LET w=t
END FUNCTION
SET POINT STYLE 1
SET WINDOW -2,2,-2,2
DRAW grid
FOR x=-2 TO 2 STEP 0.00001
PLOT LINES:x,w(x);
NEXT x
END
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/25 (Sat) 07:25:56
上掲のプログラムで,w(x)≒0付近の相対誤差ではなく,絶対誤差のみを要求するとき,FOR文の始値n=200は過大です。
COSの値は―1~1の範囲になるのでw(x)の和は公比a=1/2の等比級数の和で抑えられます。
たとえば,n=54に選べば,計算しない残余項の和は2^(-54)以下になります。
なお,n≦54であっても,nが少し大きな数だと,b^n*xはかなり大きな数になって誤差をはらみ,r=MOD(b^n*x,2)は多くの場合,0になります。
そのあたりまで考えて正確に計算したいのであれば,MOD(b^n*x,2)を正確に導き出す手法を編み出す必要があります。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/04/25 (Sat) 09:45:10
MOD(b^n*x,2) = MOD((b^(n-1)*x)*b,2) = MOD(MOD(b^(n-1)*x,2)*b,2) を使えばよさそうです。
LET b=11
FOR x=-2 TO 2 STEP 2^(-10)
LET r=MOD(x,2)
FOR n=1 TO 60
LET r=MOD(r*b,2)
PRINT x,n,r
NEXT n
NEXT x
END
xに2進小数として切りのいい数を指定しないと,カオスになります。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/05/03 (Sun) 08:36:57
上掲プログラムで,xに2進小数として切りのいい数を指定しないとカオスになるのは,2進モードのMOD関数が十分な精度を持たないのが影響していました。修正します。
Re: 三角関数値が異常です - SHIRAISHI Kazuo
2026/05/16 (Sat) 09:10:26
ワイエルシュトラス関数のグラフを描くプログラムです。
グラフを描く目的ならさほど多くの項の計算は不要です。
2進倍精度で計算するのであれば,140行で求めているNmaxまで計算することが目安になります。
100 REM ワイエルシュトラス関数
110 OPTION ARITHMETIC NATIVE
120 LET a=0.5
130 LET b=13
140 LET Nmax=-54*LOG2(a)
150 FUNCTION w(x)
160 LET t=0
170 LET r=MOD(x,2)
180 FOR n=0 TO NMax
190 LET t=t+a^n*COS(r*PI)
200 LET r=MOD(r*b,2)
210 NEXT n
220 LET w=t
230 END FUNCTION
240 SET POINT STYLE 1
250 SET WINDOW -2,2,-2,2
260 DRAW GRID
270 FOR x=-2 TO 2 STEP 2^(-18)
280 PLOT POINTS:x,w(x)
290 NEXT x
300 END
https://ja.wikipedia.org/wiki/ワイエルシュトラス関数
にある画像は,a=0.5,b=3 程度で作成されたもののように思えます。
BASICAcc 1.2.3.0 ParactBASIC 2.1.5.0 - SHIRAISHI Kazuo
2026/05/15 (Fri) 21:02:45
BASICAcc 1.2.3.0とParactBASIC 2.1.5.0で,Intel FPU環境で引数の絶対値が2^63以上だと三角関数が異常値をとる不具合を修正しました。
従来,FPCのsin, cosを直接利用する形に翻訳していたものを,別途用意したライブラリを使う形にするために,内部構造を変更しています。
関係ないところに変更の余波が及ぶ可能性もあるので,不具合に気付いた方は報告をお願いします。
微細構造定数と質量比3種 - 百瀬
2026/05/15 (Fri) 14:14:45
CODATA2022の不確かさ内の精度で物理定数を導出します。
数字パズルとして組合わせを見つける確率や情報圧縮の
観点から、結果を狙っての設計は不可能だと思いますが、
お詳しい方のご意見を頂けましたら幸いです。
LET u=1
LET r=u+2
LET a=r*(r-u)
LET b=2
LET nn=a+b-u
LET rel=a+b+r
LET ph=nn+b
LET h=rel+u+nn
LET n=r+rel+ph+h
LET c=2*n
LET p=4*ATN(1)
LET t=1-a/nn^2
LET Phi=n*r+rel+r/c+(rel-ph)/c^2+(18/(nn*p))*t/c^3+(4*p)*t/c^4
LET d1=r+ph+u
LET d2=h*(n-(r+u))
LET d3=d1*d2
LET d4=d2*(n-(r+u))*a*(rel-r)
LET P1=c*(h+r)-(ph+r)+(rel-ph)/d1-u/d2+(rel-ph)/d3-u/d4
LET P2=h*rel-r+(rel-u)/d1-u/d2+(r+u)/d3+(h-r-u)/d4
LET P3=n*(c-u)-ph+(rel-ph)/d1-(rel-ph)/d2+(r+u)/d3-(r*h)/d4
PRINT "Alpha^-1="; Phi
PRINT "Proton ="; P1
PRINT "Muon ="; P2
PRINT "Tau ="; P3
END
ガチャ - しばっち
2026/05/03 (Sun) 07:41:47
ガチャ(カブセルトイ)N種を全種揃えるまでにかかった回数
https://keisan.site/exec/system/1375851215#google_vignette
https://manabitimes.jp/math/1053
出現確率は全て同じとする。(シークレット等特別なものはここでは考慮していない)
! ガチャN種を全種揃えるまでにかかった回数
RANDOMIZE
LET TRUE=1
LET FALSE=0
LET N=6 ! ガチャ種類
LET ITER=300 ! 試行回数
DIM A(N),C(N*12)
FOR J=1 TO ITER
LET COUNT=0
MAT A=ZER
DO
LET COUNT=COUNT+1
LET K=INT(RND*N+1)
LET A(K)=A(K)+1
LET FL=TRUE
FOR I=1 TO N
IF A(I)=0 THEN LET FL=FALSE
NEXT I
LOOP UNTIL FL=TRUE
LET C(COUNT)=C(COUNT)+1
NEXT J
FOR I=N TO N*12
PRINT USING"###":I;
PRINT "回 :";REPEAT$("*",C(I));C(I);C(I)/ITER*100;"%"
LET S=S+I*C(I)
IF C(I)>0 AND SMIN=0 THEN LET SMIN=I
IF C(I)>V THEN
LET V=C(I)
LET MOST=I
END IF
NEXT I
FOR I=N*12 TO N STEP -1
IF C(I)>0 AND SMAX=0 THEN LET SMAX=I
NEXT I
PRINT "平均";S/ITER;"回"
PRINT "最低";SMIN;"回"
PRINT "最大";SMAX;"回"
PRINT "最頻値";MOST;"回"
END
下記結果は6種類の時、全てゲットするまでにかかった回数
300回試行した結果、最低6回(超ラッキー 1.33%)でゲットし、最大62回(超ついてない 0.33%)も費やした。
ガチャ1回300円とすると300円×6回で最低1800円。最大300円×62回で18600円もかかる
実行結果
6回 :**** 4 1.33333333333333 %
7回 :************ 12 4 %
8回 :*************** 15 5 %
9回 :******************* 19 6.33333333333333 %
10回 :************************ 24 8 %
11回 :********************** 22 7.33333333333333 %
12回 :***************************** 29 9.66666666666667 %
13回 :**************** 16 5.33333333333333 %
14回 :*********************** 23 7.66666666666667 %
15回 :***************** 17 5.66666666666667 %
16回 :******************* 19 6.33333333333333 %
17回 :************** 14 4.66666666666667 %
18回 :******** 8 2.66666666666667 %
19回 :************* 13 4.33333333333333 %
20回 :*********** 11 3.66666666666667 %
21回 :******* 7 2.33333333333333 %
22回 :********* 9 3 %
23回 :** 2 .666666666666667 %
24回 :**** 4 1.33333333333333 %
25回 :** 2 .666666666666667 %
26回 :******* 7 2.33333333333333 %
27回 :** 2 .666666666666667 %
28回 :***** 5 1.66666666666667 %
29回 :** 2 .666666666666667 %
30回 : 0 0 %
31回 :**** 4 1.33333333333333 %
32回 :**** 4 1.33333333333333 %
33回 : 0 0 %
34回 :* 1 .333333333333333 %
35回 :* 1 .333333333333333 %
36回 : 0 0 %
37回 :* 1 .333333333333333 %
38回 : 0 0 %
39回 : 0 0 %
40回 :* 1 .333333333333333 %
41回 :* 1 .333333333333333 %
42回 : 0 0 %
43回 : 0 0 %
44回 : 0 0 %
45回 : 0 0 %
46回 : 0 0 %
47回 : 0 0 %
48回 : 0 0 %
49回 : 0 0 %
50回 : 0 0 %
51回 : 0 0 %
52回 : 0 0 %
53回 : 0 0 %
54回 : 0 0 %
55回 : 0 0 %
56回 : 0 0 %
57回 : 0 0 %
58回 : 0 0 %
59回 : 0 0 %
60回 : 0 0 %
61回 : 0 0 %
62回 :* 1 .333333333333333 %
63回 : 0 0 %
64回 : 0 0 %
65回 : 0 0 %
66回 : 0 0 %
67回 : 0 0 %
68回 : 0 0 %
69回 : 0 0 %
70回 : 0 0 %
71回 : 0 0 %
72回 : 0 0 %
平均 15.4633333333333 回
最低 6 回
最大 62 回
最頻値 12 回
----------------------------------------------------------------------------
! ガチャN種を全種揃えるまでにかかる期待値
SET WINDOW -3,50,-10,300
DRAW GRID(5,10)
FOR N=1 TO 50
LET S=0
FOR K=1 TO N
LET S=S+1/K
NEXT K
PLOT LINES:N,S*N;
NEXT N
END
Re: ガチャ - しばっち
2026/05/03 (Sun) 07:43:01
https://dskjal.com/statistics/chance-calculator-jp
https://mikami3345.cloudfree.jp/Probability/Probability.html
! スマホガチャ 当選率P%をN回ガチャ引いて1個以上当たる確率
!LET P=1/100 ! 当選率
!LET N=100 ! ガチャを引く回数
!PRINT (1-(1-P)^N)*100;"%"
SET WINDOW -10,150,-10,100
DRAW GRID(10,10)
LET P=1/100 ! 当選率
FOR N=0 TO 150 ! ガチャを引く回数
PLOT LINES:N,(1-(1-P)^N)*100;
NEXT N
END
-----------------------------------------------------------------------
上記のシュミレーションプログラム
RANDOMIZE
DIM GACHA(100)
INPUT PROMPT "当選確率 (%)(1-99) ":L
INPUT PROMPT "ガチャを引く回数 ":N
LET M=500 ! 試行回数
FOR I=1 TO L ! 100個のうちL個が当たり
LET GACHA(I)=1
NEXT I
FOR I=1 TO M
FOR J=1 TO 100 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100+1))
NEXT J
LET FLG=0
FOR J=1 TO N
LET P=INT(RND*100+1) ! ガチャを引く
IF GACHA(P)=1 THEN ! 当たりを引いた
LET FLG=1
EXIT FOR
END IF
NEXT J
IF FLG=0 THEN LET C=C+1 ! 全部外れたらカウント
NEXT I
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いて当たる確率";(M-C)/M*100;"%"
END
実行結果
当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いて当たる確率 62.2 %
-----------------------------------------------------------------------
当選確率L%の時、N回ガチャを引いて当たる回数の確率
OPTION BASE 0
RANDOMIZE
DIM GACHA(100),C(100)
INPUT PROMPT "当選確率 (%)(1-99) ":L ! L=1
INPUT PROMPT "ガチャを引く回数 ":N ! N=100
LET M=500 ! 試行回数
FOR I=1 TO L ! 100個のうちL個が当たり
LET GACHA(I)=1
NEXT I
FOR I=1 TO M
FOR J=1 TO 100 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100+1))
NEXT J
LET HIT=0
FOR J=1 TO N
LET P=INT(RND*100+1) ! ガチャを引く
IF GACHA(P)=1 THEN ! 当たりを引いた
LET HIT=HIT+1
END IF
NEXT J
LET C(HIT)=C(HIT)+1
NEXT I
FOR I=1 TO 100
IF C(I)>0 THEN PRINT "当選確率";L;"%の時、";N;"回ガチャを引いて";I;"回当たる確率";C(I)/M*100;"%"
NEXT I
END
実行結果
当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いて 1 回当たる確率 34.2 %
当選確率 1 %の時、 100 回ガチャを引いて 2 回当たる確率 21.4 %
当選確率 1 %の時、 100 回ガチャを引いて 3 回当たる確率 5.8 %
当選確率 1 %の時、 100 回ガチャを引いて 4 回当たる確率 1.4 %
当選確率 1 %の時、 100 回ガチャを引いて 5 回当たる確率 .2 %
当選確率 1 %の時、 100 回ガチャを引いて 9 回当たる確率 .2 %
-----------------------------------------------------------------------
入手確率 X%を達成するために必要な試行回数
LET P=1/100 ! 当選率
LET N=99/100 ! 入手確率
FOR X=1 TO 10000
IF 1-(1-P)^X>N THEN EXIT FOR
NEXT X
PRINT "当選確率";P*100;"% 入手確率";N*100;"% 達するために必要な試行回数";X;"回"
END
-----------------------------------------------------------------------
N回ガチャ引いても当たらない確率
LET N=100 ! 試行回数
LET P=.5/100 ! 当選確率
PRINT "当選確率";P*100;"%の時、";N;"回ガチャを引いても当たらない確率";(1-P)^N*100;"%"
END
-----------------------------------------------------------------------
当たりが2個ある場合の確率
但し、当選確率1%という時、合わせての合計確率1/200+1/200で1/100つまり計1%と
それぞれが1%、つまり1/100+1/100で計2%となる場合の2通りがある。
RANDOMIZE
DIM GACHA(200)
LET M=500 ! 試行回数
LET MODE=1
SELECT CASE MODE
CASE 1
INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
FOR I=1 TO L ! 200個のうちL個が当たり L/200+L/200=L/100(L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
NEXT I
CASE 2
INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
FOR I=1 TO L*2 ! 200個のうち2*L個が当たり L/100(L%)+L/100(L%)=2*L/100 (2L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
NEXT I
!CASE 3
! INPUT PROMPT "1,2合わせての当選確率 (%)(1-99) ":L1,L2
! FOR I=1 TO L1 ! 200個のうちL1個とL2個が当たり L1/200+L2/200
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
!CASE 4
! INPUT PROMPT "1,2個別の当選確率 (%)(1-99) ":L1,L2
! FOR I=1 TO L1*2 ! 200個のうちL1個とL2個が当たり L1/100+L2/100
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2*2
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 200 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*200+1))
NEXT J
LET HIT1=0
LET HIT2=0
FOR J=1 TO N
LET P=INT(RND*200+1) ! ガチャを引く
IF GACHA(P)=1 THEN LET HIT1=HIT1+1
IF GACHA(P)=2 THEN LET HIT2=HIT2+1
NEXT J
IF (HIT1>0 AND HIT2=0) OR (HIT1=0 AND HIT2>0) THEN LET EITHER=EITHER+1
IF HIT1>0 AND HIT2>0 THEN LET BOTH=BOTH+1
IF HIT1=0 AND HIT2=0 THEN LET MISS=MISS+1
NEXT I
IF L>0 THEN
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどちらかが当たる確率";EITHER/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどちらも当たる確率";BOTH/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどちらも外れる確率";MISS/M*100;"%"
ELSE
PRINT "当選確率";L1;"%、";L2;"%の時、";N;"回ガチャを引いてどちらかが当たる確率";EITHER/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%の時、";N;"回ガチャを引いてどちらも当たる確率";BOTH/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%の時、";N;"回ガチャを引いてどちらも外れる確率";MISS/M*100;"%"
END IF
END
実行結果
合わせての当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いてどちらかが当たる確率 46.2 %
当選確率 1 %の時、 100 回ガチャを引いてどちらも当たる確率 15 %
当選確率 1 %の時、 100 回ガチャを引いてどちらも外れる確率 38.8 %
-----------------------------------------------------------------------
当たりが3個ある場合の確率
RANDOMIZE
DIM GACHA(300)
LET M=500 ! 試行回数
LET MODE=1
SELECT CASE MODE
CASE 1
INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
FOR I=1 TO L ! 300個のうちL個が当たり L/300+L/300+L/300=L/100(L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
LET C=C+1
LET GACHA(C)=3
NEXT I
CASE 2
INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
FOR I=1 TO L*3 ! 300個のうち3*L個が当たり L/100(L%)+L/100(L%)+L/100(L%)=L/50 (3L%)
LET C=C+1
LET GACHA(C)=1
LET C=C+1
LET GACHA(C)=2
LET C=C+1
LET GACHA(C)=3
NEXT I
!CASE 3
! INPUT PROMPT "1,2,3合わせての当選確率 (%)(1-99) ":L1,L2,L3
! FOR I=1 TO L1 ! 300個のうちL個が当たり L1/300+L2/300+L3/300
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
! FOR I=1 TO L3
! LET C=C+1
! LET GACHA(C)=3
! NEXT I
!CASE 4
! INPUT PROMPT "1,2,3個別の当選確率 (%)(1-99) ":L1,L2,L3
! FOR I=1 TO L1*3 ! 300個のうちL個が当たり L1/100+L2/100+L3/100
! LET C=C+1
! LET GACHA(C)=1
! NEXT I
! FOR I=1 TO L2*3
! LET C=C+1
! LET GACHA(C)=2
! NEXT I
! FOR I=1 TO L3*3
! LET C=C+1
! LET GACHA(C)=3
! NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 300 ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*300+1))
NEXT J
LET HIT1=0
LET HIT2=0
LET HIT3=0
FOR J=1 TO N
LET P=INT(RND*300+1) ! ガチャを引く
IF GACHA(P)=1 THEN LET HIT1=HIT1+1
IF GACHA(P)=2 THEN LET HIT2=HIT2+1
IF GACHA(P)=3 THEN LET HIT3=HIT3+1
NEXT J
IF HIT1>0 AND HIT2=0 AND HIT3=0 THEN LET EITHER1=EITHER1+1
IF HIT1=0 AND HIT2>0 AND HIT3=0 THEN LET EITHER1=EITHER1+1
IF HIT1=0 AND HIT2=0 AND HIT3>0 THEN LET EITHER1=EITHER1+1
IF HIT1>0 AND HIT2>0 AND HIT3=0 THEN LET EITHER2=EITHER2+1 ! 1,2
IF HIT1>0 AND HIT3>0 AND HIT2=0 THEN LET EITHER2=EITHER2+1 ! 1,3
IF HIT2>0 AND HIT3>0 AND HIT1=0 THEN LET EITHER2=EITHER2+1 ! 2,3
IF HIT1>0 AND HIT2>0 AND HIT3>0 THEN LET ALL=ALL+1
IF HIT1=0 AND HIT2=0 AND HIT3=0 THEN LET MISS=MISS+1
NEXT I
IF L>0 THEN
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどれか1種類が当たる確率";EITHER1/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどれか2種類が当たる確率";EITHER2/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いて全種類が当たる確率";ALL/M*100;"%"
PRINT "当選確率";L;"%の時、";N;"回ガチャを引いてどれも外れる確率";MISS/M*100;"%"
ELSE
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いてどれか1種類が当たる確率";EITHER1/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いてどれか2種類が当たる確率";EITHER2/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いて全種類が当たる確率";ALL/M*100;"%"
PRINT "当選確率";L1;"%、";L2;"%、";L3;"%の時、";N;"回ガチャを引いてどれも外れる確率";MISS/M*100;"%"
END IF
END
実行結果
合わせての当選確率 (%)(1-99) 1
ガチャを引く回数 100
当選確率 1 %の時、 100 回ガチャを引いてどれか1種類が当たる確率 44.4 %
当選確率 1 %の時、 100 回ガチャを引いてどれか2種類が当たる確率 17.4 %
当選確率 1 %の時、 100 回ガチャを引いて全種類が当たる確率 2.2 %
当選確率 1 %の時、 100 回ガチャを引いてどれも外れる確率 36 %
-----------------------------------------------------------------------
当たりが複数の場合
OPTION BASE 0
RANDOMIZE
INPUT PROMPT "当たりの種類 ":K
INPUT PROMPT "ガチャを引く回数 ":N
DIM GACHA(100*K),C(K,N),HIT(K),LL(K)
LET M=500 ! 試行回数
LET MODE=1
SELECT CASE MODE
CASE 1
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET CC=CC+1
LET GACHA(CC)=I
NEXT J
NEXT I
CASE 2
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET CC=CC+1
LET GACHA(CC)=I
NEXT J
NEXT I
END SELECT
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR F=1 TO K
IF GACHA(P)=F THEN
LET HIT(F)=HIT(F)+1 ! F種目の当たり引いた
EXIT FOR
END IF
NEXT F
NEXT J
FOR F=1 TO K
LET C(F,HIT(F))=C(F,HIT(F))+1
NEXT F
NEXT I
FOR I=1 TO N
FOR F=1 TO K
IF C(F,I)>0 THEN
PRINT "当選確率";LL(F);"%の時、";N;"回ガチャを引いて";F;"種目が";I;"回当たる確率";C(F,I)/M*100;"%"
END IF
NEXT F
IF C(K,I)>0 THEN PRINT
NEXT I
END
実行結果
当たりの種類 3
ガチャを引く回数 100
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
当選確率 1 %の時、 100 回ガチャを引いて 1 種目が 1 回当たる確率 23.8 %
当選確率 2 %の時、 100 回ガチャを引いて 2 種目が 1 回当たる確率 32.4 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 1 回当たる確率 38 %
当選確率 1 %の時、 100 回ガチャを引いて 1 種目が 2 回当たる確率 4 %
当選確率 2 %の時、 100 回ガチャを引いて 2 種目が 2 回当たる確率 11.8 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 2 回当たる確率 17.2 %
当選確率 2 %の時、 100 回ガチャを引いて 2 種目が 3 回当たる確率 2.6 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 3 回当たる確率 7 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 4 回当たる確率 1.4 %
当選確率 3 %の時、 100 回ガチャを引いて 3 種目が 5 回当たる確率 .6 %
-----------------------------------------------------------------------
これ以下より当たりがK種で内2つ、3つ、4つが当たりの場合のプログラムを挙げているが
当たり判定を微妙に変えているので注意すること
当たりがK種ある場合の内、少なくとも2つが当たる確率を個別に求める
A,B,Cの3種類当たりがあるとして(A>0 を当たり、A=0をハズレとする)
少なくともAかBが当たり A>0 OR B>0
少なくともAとBが当たり A>0 AND B>0
AかBのみが当たり (A>0 OR B>0) AND C=0
AとBのみが当たり A>0 AND B>0 AND C=0
また、IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 として
当たる確率を求めているが
IF GACHA(P)<>JJ THEN LET MISS(JJ)=MISS(JJ)+1 と変更すれば
外れの確率を求めることもできる
RANDOMIZE
INPUT PROMPT "当たりの種類":K
DIM GACHA(100*K),HIT(K),EITHER(DEFARRAY2(K,K)),LL(K)
LET M=500 ! 試行回数
LET MODE=3
SELECT CASE MODE
!CASE 1
! INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
! FOR I=1 TO L
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
!CASE 2
! INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
! FOR I=1 TO L*K
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
CASE 3
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
CASE 4
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR JJ=1 TO K
IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 ! 当たりなら
NEXT JJ
NEXT J
FOR J1=1 TO K-1
FOR J2=J1+1 TO K
IF HIT(J1)>0 OR HIT(J2)>0 THEN
LET EITHER(ARRAY2(J1,J2))=EITHER(ARRAY2(J1,J2))+1
END IF
NEXT J2
NEXT J1
NEXT I
FOR J1=1 TO K-1
FOR J2=J1+1 TO K
PRINT N;"回ガチャを引いて少なくとも";J1;"か";J2;"が当たる確率";EITHER(ARRAY2(J1,J2))/M*100;"%"
NEXT J2
NEXT J1
FUNCTION DEFARRAY2(AMAX,BMAX)
LET MAX1=AMAX
LET MAX2=BMAX
LET DEFARRAY2=MAX2*MAX1
END FUNCTION
FUNCTION ARRAY2(X,Y)
LET X=INT(X)
LET Y=INT(Y)
IF X>MAX1 THEN LET X=MAX1
IF Y>MAX2 THEN LET Y=MAX2
IF X<1 THEN LET X=1
IF Y<1 THEN LET Y=1
LET SUM= MAX1*(Y-1)
LET SUM=SUM+X
LET ARRAY2=SUM
END FUNCTION
END
実行結果
当たりの種類3
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
ガチャを引く回数 100
100 回ガチャを引いて少なくとも 1 か 2 が当たる確率 63.2 %
100 回ガチャを引いて少なくとも 1 か 3 が当たる確率 76 %
100 回ガチャを引いて少なくとも 2 か 3 が当たる確率 81.2 %
-----------------------------------------------------------------------
当たりがK種ある場合の内3つのみが当たる確率を個別に求める
RANDOMIZE
DO
INPUT PROMPT "当たりの種類":K ! K>=4
LOOP WHILE K<4
DIM GACHA(100*K),HIT(K),EITHER(DEFARRAY3(K,K,K)),LL(K)
LET M=500 ! 試行回数
LET MODE=4
SELECT CASE MODE
!CASE 1
! INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
! FOR I=1 TO L
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
!CASE 2
! INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
! FOR I=1 TO L*K
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
CASE 3
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
CASE 4
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR JJ=1 TO K
IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 ! 当たりなら
NEXT JJ
NEXT J
FOR J1=1 TO K-2
FOR J2=J1+1 TO K-1
FOR J3=J2+1 TO K
IF HIT(J1)>0 AND HIT(J2)>0 AND HIT(J3)>0 THEN
LET FLG=0
FOR JJ=1 TO K
IF J1<>JJ AND J2<>JJ AND J3<>JJ AND HIT(JJ)<>0 THEN LET FLG=1
NEXT JJ
IF FLG=0 THEN LET EITHER(ARRAY3(J1,J2,J3))=EITHER(ARRAY3(J1,J2,J3))+1
END IF
NEXT J3
NEXT J2
NEXT J1
NEXT I
FOR J1=1 TO K-2
FOR J2=J1+1 TO K-1
FOR J3=J2+1 TO K
PRINT N;"回ガチャを引いて";J1;"と";J2;"と";J3;"のみが当たる確率";EITHER(ARRAY3(J1,J2,J3))/M*100;"%"
NEXT J3
NEXT J2
NEXT J1
FUNCTION DEFARRAY3(AMAX,BMAX,CMAX)
LET MAX1=AMAX
LET MAX2=BMAX
LET MAX3=CMAX
LET DEFARRAY3=MAX3*MAX2*MAX1
END FUNCTION
FUNCTION ARRAY3(X,Y,Z)
LET X=INT(X)
LET Y=INT(Y)
LET Z=INT(Z)
IF X>MAX1 THEN LET X=MAX1
IF Y>MAX2 THEN LET Y=MAX2
IF Z>MAX3 THEN LET Z=MAX3
IF X<1 THEN LET X=1
IF Y<1 THEN LET Y=1
IF Z<1 THEN LET Z=1
LET SUM= MAX2*MAX1*(Z-1)
LET SUM=SUM+MAX1*(Y-1)
LET SUM=SUM+X
LET ARRAY3=SUM
END FUNCTION
END
実行結果
当たりの種類6
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
4の当選確率 (%)(1-99) 4
5の当選確率 (%)(1-99) 5
6の当選確率 (%)(1-99) 6
ガチャを引く回数 100
100 回ガチャを引いて 1 と 2 と 3 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 2 と 4 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 2 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 2 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 3 と 4 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 3 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 3 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 4 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 4 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 1 と 5 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 3 と 4 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 3 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 3 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 4 と 5 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 4 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 2 と 5 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 3 と 4 と 5 のみが当たる確率 .2 %
100 回ガチャを引いて 3 と 4 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 3 と 5 と 6 のみが当たる確率 0 %
100 回ガチャを引いて 4 と 5 と 6 のみが当たる確率 .2 %
-----------------------------------------------------------------------
当たりがK種ある場合の内4つが当たる確率を個別に求める
RANDOMIZE
DO
INPUT PROMPT "当たりの種類":K ! K>=5
LOOP WHILE K<5
DIM GACHA(100*K),HIT(K),EITHER(DEFARRAY4(K,K,K,K)),LL(K)
LET M=500 ! 試行回数
LET MODE=4
SELECT CASE MODE
!CASE 1
! INPUT PROMPT "合わせての当選確率 (%)(1-99) ":L
! FOR I=1 TO L
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
!CASE 2
! INPUT PROMPT "個別の当選確率 (%)(1-99) ":L
! FOR I=1 TO L*K
! FOR J=1 TO K
! LET C=C+1
! LET GACHA(C)=J
! NEXT J
! NEXT I
CASE 3
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
CASE 4
FOR J=1 TO K
INPUT PROMPT STR$(J)&"の当選確率 (%)(1-99) ":LL(J)
NEXT J
FOR I=1 TO K
FOR J=1 TO LL(I)*K
LET C=C+1
LET GACHA(C)=I
NEXT J
NEXT I
END SELECT
INPUT PROMPT "ガチャを引く回数 ":N
FOR I=1 TO M
FOR J=1 TO 100*K ! シャッフル
SWAP GACHA(J),GACHA(INT(RND*100*K+1))
NEXT J
MAT HIT=ZER
FOR J=1 TO N
LET P=INT(RND*100*K+1) ! ガチャを引く
FOR JJ=1 TO K
IF GACHA(P)=JJ THEN LET HIT(JJ)=HIT(JJ)+1 ! 当たりなら
NEXT JJ
NEXT J
FOR J1=1 TO K-3
FOR J2=J1+1 TO K-2
FOR J3=J2+1 TO K-1
FOR J4=J3+1 TO K
IF HIT(J1)>0 OR HIT(J2)>0 OR HIT(J3)>0 OR HIT(J4)>0 THEN
LET FLG=0
FOR JJ=1 TO K
IF J1<>JJ AND J2<>JJ AND J3<>JJ AND J4<>JJ AND HIT(JJ)<>0 THEN LET FLG=1
NEXT JJ
IF FLG=0 THEN LET EITHER(ARRAY4(J1,J2,J3,J4))=EITHER(ARRAY4(J1,J2,J3,J4))+1
END IF
NEXT J4
NEXT J3
NEXT J2
NEXT J1
NEXT I
FOR J1=1 TO K-3
FOR J2=J1+1 TO K-2
FOR J3=J2+1 TO K-1
FOR J4=J3+1 TO K
PRINT N;"回ガチャを引いて";J1;"か";J2;"か";J3;"か";J4;"のみが当たる確率";EITHER(ARRAY4(J1,J2,J3,J4))/M*100;"%"
NEXT J4
NEXT J3
NEXT J2
NEXT J1
FUNCTION DEFARRAY4(AMAX,BMAX,CMAX,DMAX)
LET MAX1=AMAX
LET MAX2=BMAX
LET MAX3=CMAX
LET MAX4=DMAX
LET DEFARRAY4=MAX4*MAX3*MAX2*MAX1
END FUNCTION
FUNCTION ARRAY4(X,Y,Z,W)
LET X=INT(X)
LET Y=INT(Y)
LET Z=INT(Z)
LET W=INT(W)
IF X>MAX1 THEN LET X=MAX1
IF Y>MAX2 THEN LET Y=MAX2
IF Z>MAX3 THEN LET Z=MAX3
IF W>MAX4 THEN LET W=MAX4
IF X<1 THEN LET X=1
IF Y<1 THEN LET Y=1
IF Z<1 THEN LET Z=1
IF W<1 THEN LET W=1
LET SUM= MAX3*MAX2*MAX1*(W-1)
LET SUM=SUM+MAX2*MAX1*(Z-1)
LET SUM=SUM+MAX1*(Y-1)
LET SUM=SUM+X
LET ARRAY4=SUM
END FUNCTION
END
実行結果
当たりの種類5
1の当選確率 (%)(1-99) 1
2の当選確率 (%)(1-99) 2
3の当選確率 (%)(1-99) 3
4の当選確率 (%)(1-99) 4
5の当選確率 (%)(1-99) 5
ガチャを引く回数 100
100 回ガチャを引いて 1 か 2 か 3 か 4 のみが当たる確率 .6 %
100 回ガチャを引いて 1 か 2 か 3 か 5 のみが当たる確率 1.4 %
100 回ガチャを引いて 1 か 2 か 4 か 5 のみが当たる確率 5.2 %
100 回ガチャを引いて 1 か 3 か 4 か 5 のみが当たる確率 12.6 %
100 回ガチャを引いて 2 か 3 か 4 か 5 のみが当たる確率 33 %
実行ファイルの作り方 - 永野護
2026/05/02 (Sat) 03:02:53
実行ファイルの作り方を教えてください。
Re: 実行ファイルの作り方 - SHIRAISHI Kazuo
2026/05/02 (Sat) 07:46:01
2進モード,複素数モードで動くプログラムは,たいていの場合,BASIC Accelerator で実行ファイル化できます。
https://decimalbasic.web.fc2.com/BASICAccJa.htm
実行ファイルは,outoutフォルダにNoName.exeとして生成されるので,適宜,名称を変更してください。
特別なDLLに依存せずに動作します。
Re: 実行ファイルの作り方 - 永野護
2026/05/02 (Sat) 08:20:14
ありがとうございました。
ver7881がダウンロードできません - やまだ
2026/04/22 (Wed) 10:25:44
windowsアーカイブ版のBASIC7881.zipをダウンロードすると、ver.4.4.23 2006.4.16がダウンロードされてしまいます。こちらの操作が変でなのでしょうか?
Re: ver7881がダウンロードできません - SHIRAISHI Kazuo
2026/04/22 (Wed) 11:42:08
ご報告ありがとうございました。
BASIC7881.zipはBASICW95のアーカイブになっていました。お手数をお掛けしますが,再度,ダウンロードをお願いします。
じゃんけん - しばっち
2026/04/12 (Sun) 07:44:49
N人でのじゃんけんが終了する(残り一人になる)までの回数
RANDOMIZE
INPUT PROMPT "人数=":N
DIM A(N),J$(0 TO 2),P(0 TO 2)
LET J$(0)="グー"
LET J$(1)="チョッキ"
LET J$(2)="パー"
DO
LET COUNT=COUNT+1
MAT A=ZER
MAT P=ZER
! PRINT COUNT;"回"
FOR I=1 TO N
LET A(I)=INT(RND*3)
! PRINT J$(A(I)),
NEXT I
! PRINT
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)>0 AND P(1)>0 AND P(2)=0 THEN LET N=P(0) ! グーの勝ち
IF P(0)>0 AND P(1)=0 AND P(2)>0 THEN LET N=P(2) ! パーの勝ち
IF P(0)=0 AND P(1)>0 AND P(2)>0 THEN LET N=P(1) ! チョッキの勝ち
LOOP UNTIL N=1
PRINT COUNT;"回のジャンケンで残り一人になりました"
END
---------------------------------------------------------------------------
RANDOMIZE
DIM A(30),P(0 TO 2)
LET T=30 ! 試行回数
FOR NN=2 TO 30 ! 人数
LET SUM=0
FOR K=1 TO T
LET N=NN
LET COUNT=0
DO
LET COUNT=COUNT+1
MAT A=ZER
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*3)
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)>0 AND P(1)>0 AND P(2)=0 THEN LET N=P(0) ! グーの勝ち
IF P(0)>0 AND P(1)=0 AND P(2)>0 THEN LET N=P(2) ! パーの勝ち
IF P(0)=0 AND P(1)>0 AND P(2)>0 THEN LET N=P(1) ! チョキの勝ち
LOOP UNTIL N=1
LET SUM=SUM+COUNT
NEXT K
PRINT NN;"人の時";SUM/T;"回"
NEXT NN
END
30回試行させてじゃんけんで一人になるまでの平均回数を求めてみた。
実行結果
2 人の時 1.7 回
3 人の時 2.23333333333333 回
4 人の時 2.93333333333333 回
5 人の時 4.26666666666667 回
6 人の時 7.1 回
7 人の時 9.3 回
8 人の時 11.2333333333333 回
9 人の時 19.2333333333333 回
10 人の時 27.5333333333333 回
11 人の時 37.0333333333333 回
12 人の時 51.0333333333333 回
13 人の時 54.3333333333333 回
14 人の時 74.4666666666667 回
15 人の時 134 回
16 人の時 274.1 回
17 人の時 354.166666666667 回
18 人の時 527.233333333333 回
19 人の時 735.066666666667 回
20 人の時 1025.76666666667 回
21 人の時 1900.8 回
22 人の時 2451.56666666667 回
23 人の時 3752.83333333333 回
24 人の時 5382.76666666667 回
25 人の時 9291.76666666667 回
26 人の時 12405.2666666667 回
27 人の時 19177.9 回
28 人の時 28564.6333333333 回
29 人の時 33776.7333333333 回
30 人の時 81116.3 回
Re: じゃんけん - しばっち
2026/04/12 (Sun) 07:46:03
じゃんけんをして一人だけが勝ち抜けするまでの回数
但し、途中で勝っても抜けず一人だけが勝つ迄の回数
RANDOMIZE
INPUT PROMPT "人数=":N
DIM A(N),J$(0 TO 2),P(0 TO 2)
LET J$(0)="グー"
LET J$(1)="チョキ"
LET J$(2)="パー"
DO
LET COUNT=COUNT+1
MAT A=ZER
MAT P=ZER
! PRINT COUNT;"回"
FOR I=1 TO N
LET A(I)=INT(RND*3)
! PRINT J$(A(I)),
NEXT I
! PRINT
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)=1 AND P(1)>0 AND P(2)=0 THEN EXIT DO ! グーの一人勝ち
IF P(0)>0 AND P(1)=0 AND P(2)=1 THEN EXIT DO ! パーの一人勝ち
IF P(0)=0 AND P(1)=1 AND P(2)>0 THEN EXIT DO ! チョキの一人勝ち
LOOP
PRINT COUNT;"回のジャンケンで一人勝ちになりました"
END
-------------------------------------------------------------------
20回試行して一人勝ちする迄の平均回数を求めてみた。
RANDOMIZE
DIM A(15),P(0 TO 2)
LET L=20
FOR NN=2 TO 15 ! 人数
LET SUM=0
FOR K=1 TO L ! 試行回数
LET N=NN
LET COUNT=0
DO
LET COUNT=COUNT+1
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*3)
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1
NEXT I
IF P(0)=1 AND P(1)>0 AND P(2)=0 THEN EXIT DO ! グーの一人勝ち
IF P(0)>0 AND P(1)=0 AND P(2)=1 THEN EXIT DO ! パーの一人勝ち
IF P(0)=0 AND P(1)=1 AND P(2)>0 THEN EXIT DO ! チョキの一人勝ち
LOOP
LET SUM=SUM+COUNT
NEXT K
PRINT NN;"人の時";SUM/L;"回のジャンケンで一人勝ちになりました"
NEXT NN
END
実行結果
2 人の時 1.7 回のジャンケンで一人勝ちになりました
3 人の時 2.4 回のジャンケンで一人勝ちになりました
4 人の時 3.95 回のジャンケンで一人勝ちになりました
5 人の時 14.65 回のジャンケンで一人勝ちになりました
6 人の時 43.25 回のジャンケンで一人勝ちになりました
7 人の時 107.45 回のジャンケンで一人勝ちになりました
8 人の時 217.75 回のジャンケンで一人勝ちになりました
9 人の時 740.9 回のジャンケンで一人勝ちになりました
10 人の時 2258.8 回のジャンケンで一人勝ちになりました
11 人の時 3811.85 回のジャンケンで一人勝ちになりました
12 人の時 22032.85 回のジャンケンで一人勝ちになりました
13 人の時 40635.15 回のジャンケンで一人勝ちになりました
14 人の時 85129.2 回のジャンケンで一人勝ちになりました
15 人の時 242720.1 回のジャンケンで一人勝ちになりました
同じ誕生日の人 - しばっち
2026/04/12 (Sun) 07:41:52
クラス内に誕生日が同じ人がいる確率
Mathフォルダ内のBIRTHDAY.BASのシュミレーション
RANDOMIZE
LET M=300 ! 試行回数
INPUT PROMPT "1クラスの人数=":N
DIM A(N),P(365)
FOR K=1 TO M
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1 ! 同じ誕生日をカウント
NEXT I
FOR I=1 TO 365
IF P(I)>=2 THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
PRINT "同じ誕生日の人がいる確率";C/M*100;"%"
END
----------------------------------------------------------
300回試行して平均求めてみた。
RANDOMIZE
LET M=300 ! 試行回数
DIM A(50),P(365)
FOR N=2 TO 50 ! 人数
LET C=0
FOR K=1 TO M
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1 ! 同じ誕生日をカウント
NEXT I
FOR I=1 TO 365
IF P(I)>=2 THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
PRINT N;"人のクラスの中に同じ誕生の日の人がいる確率";C/M*100;"%"
NEXT N
END
実行結果
2 人のクラスの中に同じ誕生の日の人がいる確率 .333333333333333 %
3 人のクラスの中に同じ誕生の日の人がいる確率 1.33333333333333 %
4 人のクラスの中に同じ誕生の日の人がいる確率 3.33333333333333 %
5 人のクラスの中に同じ誕生の日の人がいる確率 3 %
6 人のクラスの中に同じ誕生の日の人がいる確率 2.66666666666667 %
7 人のクラスの中に同じ誕生の日の人がいる確率 5 %
8 人のクラスの中に同じ誕生の日の人がいる確率 7.33333333333333 %
9 人のクラスの中に同じ誕生の日の人がいる確率 10 %
10 人のクラスの中に同じ誕生の日の人がいる確率 14.3333333333333 %
11 人のクラスの中に同じ誕生の日の人がいる確率 13.6666666666667 %
12 人のクラスの中に同じ誕生の日の人がいる確率 15 %
13 人のクラスの中に同じ誕生の日の人がいる確率 18 %
14 人のクラスの中に同じ誕生の日の人がいる確率 22 %
15 人のクラスの中に同じ誕生の日の人がいる確率 27 %
16 人のクラスの中に同じ誕生の日の人がいる確率 24.3333333333333 %
17 人のクラスの中に同じ誕生の日の人がいる確率 34.3333333333333 %
18 人のクラスの中に同じ誕生の日の人がいる確率 32.3333333333333 %
19 人のクラスの中に同じ誕生の日の人がいる確率 40 %
20 人のクラスの中に同じ誕生の日の人がいる確率 41 %
21 人のクラスの中に同じ誕生の日の人がいる確率 45.6666666666667 %
22 人のクラスの中に同じ誕生の日の人がいる確率 50 %
23 人のクラスの中に同じ誕生の日の人がいる確率 50.3333333333333 %
24 人のクラスの中に同じ誕生の日の人がいる確率 54.6666666666667 %
25 人のクラスの中に同じ誕生の日の人がいる確率 56 %
26 人のクラスの中に同じ誕生の日の人がいる確率 57.6666666666667 %
27 人のクラスの中に同じ誕生の日の人がいる確率 61.3333333333333 %
28 人のクラスの中に同じ誕生の日の人がいる確率 67.3333333333333 %
29 人のクラスの中に同じ誕生の日の人がいる確率 67.6666666666667 %
30 人のクラスの中に同じ誕生の日の人がいる確率 71.6666666666667 %
31 人のクラスの中に同じ誕生の日の人がいる確率 71.3333333333333 %
32 人のクラスの中に同じ誕生の日の人がいる確率 74.3333333333333 %
33 人のクラスの中に同じ誕生の日の人がいる確率 79.6666666666667 %
34 人のクラスの中に同じ誕生の日の人がいる確率 76.6666666666667 %
35 人のクラスの中に同じ誕生の日の人がいる確率 81.6666666666667 %
36 人のクラスの中に同じ誕生の日の人がいる確率 82.6666666666667 %
37 人のクラスの中に同じ誕生の日の人がいる確率 86 %
38 人のクラスの中に同じ誕生の日の人がいる確率 89 %
39 人のクラスの中に同じ誕生の日の人がいる確率 90.3333333333333 %
40 人のクラスの中に同じ誕生の日の人がいる確率 87 %
41 人のクラスの中に同じ誕生の日の人がいる確率 92 %
42 人のクラスの中に同じ誕生の日の人がいる確率 93.6666666666667 %
43 人のクラスの中に同じ誕生の日の人がいる確率 92.6666666666667 %
44 人のクラスの中に同じ誕生の日の人がいる確率 93 %
45 人のクラスの中に同じ誕生の日の人がいる確率 94.6666666666667 %
46 人のクラスの中に同じ誕生の日の人がいる確率 94.3333333333333 %
47 人のクラスの中に同じ誕生の日の人がいる確率 96 %
48 人のクラスの中に同じ誕生の日の人がいる確率 96.3333333333333 %
49 人のクラスの中に同じ誕生の日の人がいる確率 95.3333333333333 %
50 人のクラスの中に同じ誕生の日の人がいる確率 97.6666666666667 %
----------------------------------------------------------
確率から人数求めてみた。
RANDOMIZE
LET F=300 ! 試行回数
DIM A(100),P(365)
DO
INPUT PROMPT "同じ誕生日の人がいる確率 (%)":Z
LOOP UNTIL Z<100 AND Z>0
LET Z=Z/100
LET L=1
LET R=100 ! 人数
DO
LET N=INT((L+R)/2)
LET C=0
FOR K=1 TO F
MAT P=ZER
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
LET P(A(I))=P(A(I))+1 ! 同じ誕生日をカウント
NEXT I
FOR I=1 TO 365
IF P(I)>=2 THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
IF C/F<Z THEN LET L=N ELSE LET R=N
LOOP UNTIL L=R
PRINT L;"人の時、同じ誕生日の人がいる確率";Z*100;"%になります"
END
Re: 同じ誕生日の人 - しばっち
2026/04/12 (Sun) 07:43:12
1クラス内に自分と同じ誕生日の人がいる確率
RANDOMIZE
LET M=300 ! 試行回数
INPUT PROMPT "1クラスの人数=":N
DIM A(N)
LET P=INT(RND*365+1) ! 自分の誕生日
FOR K=1 TO M
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
IF A(I)=P THEN
LET C=C+1 ! 自分と同じならカウント
EXIT FOR
END IF
NEXT I
NEXT K
PRINT "自分と同じ誕生日の人がいる確率";C/M*100;"%"
END
--------------------------------------------------------------
300回試行して平均求めてみた
RANDOMIZE
LET M=300 ! 試行回数
DIM A(50)
FOR N=2 TO 50 ! 人数
LET C=0
LET P=INT(RND*365+1) ! 自分の誕生日
FOR K=1 TO M
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
IF A(I)=P THEN
LET C=C+1 ! 自分と同じならカウント
EXIT FOR
END IF
NEXT I
NEXT K
PRINT N;"人のクラスの中に自分と同じ誕生の日の人がいる確率";C/M*100;"%"
NEXT N
END
実行結果
2 人のクラスの中に自分と同じ誕生の日の人がいる確率 .333333333333333 %
3 人のクラスの中に自分と同じ誕生の日の人がいる確率 .666666666666667 %
4 人のクラスの中に自分と同じ誕生の日の人がいる確率 .333333333333333 %
5 人のクラスの中に自分と同じ誕生の日の人がいる確率 1.33333333333333 %
6 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.33333333333333 %
7 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.66666666666667 %
8 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.66666666666667 %
9 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.33333333333333 %
10 人のクラスの中に自分と同じ誕生の日の人がいる確率 6 %
11 人のクラスの中に自分と同じ誕生の日の人がいる確率 2.66666666666667 %
12 人のクラスの中に自分と同じ誕生の日の人がいる確率 3 %
13 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
14 人のクラスの中に自分と同じ誕生の日の人がいる確率 5 %
15 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
16 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.33333333333333 %
17 人のクラスの中に自分と同じ誕生の日の人がいる確率 6 %
18 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
19 人のクラスの中に自分と同じ誕生の日の人がいる確率 5.33333333333333 %
20 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
21 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
22 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.66666666666667 %
23 人のクラスの中に自分と同じ誕生の日の人がいる確率 5.33333333333333 %
24 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
25 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.66666666666667 %
26 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.66666666666667 %
27 人のクラスの中に自分と同じ誕生の日の人がいる確率 3.66666666666667 %
28 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.33333333333333 %
29 人のクラスの中に自分と同じ誕生の日の人がいる確率 9.33333333333333 %
30 人のクラスの中に自分と同じ誕生の日の人がいる確率 5.33333333333333 %
31 人のクラスの中に自分と同じ誕生の日の人がいる確率 9 %
32 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
33 人のクラスの中に自分と同じ誕生の日の人がいる確率 8.66666666666667 %
34 人のクラスの中に自分と同じ誕生の日の人がいる確率 8.66666666666667 %
35 人のクラスの中に自分と同じ誕生の日の人がいる確率 6.33333333333333 %
36 人のクラスの中に自分と同じ誕生の日の人がいる確率 8.66666666666667 %
37 人のクラスの中に自分と同じ誕生の日の人がいる確率 10.6666666666667 %
38 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
39 人のクラスの中に自分と同じ誕生の日の人がいる確率 11.6666666666667 %
40 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
41 人のクラスの中に自分と同じ誕生の日の人がいる確率 10.6666666666667 %
42 人のクラスの中に自分と同じ誕生の日の人がいる確率 10 %
43 人のクラスの中に自分と同じ誕生の日の人がいる確率 13.3333333333333 %
44 人のクラスの中に自分と同じ誕生の日の人がいる確率 12.3333333333333 %
45 人のクラスの中に自分と同じ誕生の日の人がいる確率 7.66666666666667 %
46 人のクラスの中に自分と同じ誕生の日の人がいる確率 11.6666666666667 %
47 人のクラスの中に自分と同じ誕生の日の人がいる確率 12.3333333333333 %
48 人のクラスの中に自分と同じ誕生の日の人がいる確率 9.66666666666667 %
49 人のクラスの中に自分と同じ誕生の日の人がいる確率 10.6666666666667 %
50 人のクラスの中に自分と同じ誕生の日の人がいる確率 13 %
--------------------------------------------------------------
確率から人数求めてみた
RANDOMIZE
LET F=300 ! 試行回数
DIM A(10000)
DO
INPUT PROMPT "自分と同じ誕生日の人がいる確率 (%)":Z
LOOP UNTIL Z<100 AND Z>0
LET Z=Z/100
LET L=1
LET R=10000 ! 人数
LET P=INT(RND*365+1)
DO
LET N=INT((L+R)/2)
LET C=0
FOR K=1 TO F
FOR I=1 TO N
LET A(I)=INT(RND*365+1) ! クラスの誕生日
NEXT I
FOR I=1 TO N
IF A(I)=P THEN
LET C=C+1
EXIT FOR
END IF
NEXT I
NEXT K
IF C/F<Z THEN LET L=N ELSE LET R=N
LOOP UNTIL L=R
PRINT L;"人の時、自分と同じ誕生日の人がいる確率";Z*100;"%になります"
END
カジノシュミレーション - しばっち
2026/04/05 (Sun) 07:59:54
カジノシュミレーション
https://www.casino-winnersclub.com/monte-carlo.php
https://rikei-logistics.com/monte-carlo-roulette
https://casimaru.com/monte-carlo-method/
RANDOMIZE
DIM MONTE(1000)
LET MONEY=100 ! 所持金
SET WINDOW -5,100,-10,500
DRAW GRID(5,20)
PLOT LINES:0,MONEY;
FOR I=1 TO 100 ! 試行回数
LET COUNT=0
MAT MONTE=ZER
LET HEAD=1
LET TAIL=3
LET MONTE(HEAD)=1
LET MONTE(HEAD+1)=2
LET MONTE(TAIL)=3
DO
LET COUNT=COUNT+1
LET PAY=MONTE(HEAD)+MONTE(TAIL) ! 賭け金
IF INT(RND*2)=1 THEN ! 勝ちなら
LET MONEY=MONEY+PAY
LET MONTE(HEAD)=0
LET MONTE(TAIL)=0
LET HEAD=HEAD+1
LET TAIL=TAIL-1
IF ABS(TAIL-HEAD)<=1 THEN EXIT DO ! 終了
ELSE ! 負けなら
LET MONEY=MONEY-PAY
LET MONTE(TAIL+1)=MONTE(HEAD)+MONTE(TAIL)
LET TAIL=TAIL+1
END IF
LOOP UNTIL MONEY<=0
PLOT LINES:I,MONEY;
PRINT I;"回目"
PRINT COUNT;"回繰り返し"
PRINT "所持金 ";MONEY
IF MONEY<=0 THEN EXIT FOR
NEXT I
IF MONEY<=0 THEN
PRINT "破産しました。失敗です"
ELSE
PRINT "所持金が";MONEY-100;"増えました。成功です。"
END IF
END
すごろくをちょうど終了できる確率 - しばっち
2026/04/05 (Sun) 07:58:50
! すごろくをちょうど終了できる確率
RANDOMIZE
LET K=500 ! 試行回数
FOR I=1 TO K
LET S=0
DO ! すごろく
LET S=S+INT(RND*6+1) ! サイコロ
LOOP UNTIL S>=100
IF S=100 THEN LET N=N+1 ! ちょうどゴールに到達したら
NEXT I
PRINT N/K*100;"%"
END
トランプをめくって途中で一致する確率 - しばっち
2026/04/05 (Sun) 07:57:19
!それぞれ1組ずつのトランプをめくって途中で一致する確率
RANDOMIZE
LET N=300
FOR J=1 TO N
FOR I=1 TO 53
IF INT(RND*53+1)=INT(RND*53+1) THEN
LET K=K+1
EXIT FOR
END IF
NEXT I
NEXT J
PRINT K/N*100;"%"
END
プレゼント交換で自身のプレゼントに当たる確率 - しばっち
2026/04/05 (Sun) 07:56:01
! プレゼント交換で自身のプレゼントに当たる確率
LET N=50 ! 人数
LET L=500 ! 試行回数
DIM A(N)
FOR J=1 TO L
FOR I=1 TO N
LET A(I)=I
NEXT I
FOR I=1 TO N
SWAP A(I),A(INT(RND*N+1)) ! プレゼント交換
NEXT I
FOR I=1 TO N
IF A(I)=I THEN LET K=K+1 ! 自身のプレゼント
NEXT I
NEXT J
PRINT K/L*100;"%"
END
------------------------------------------------------
! プレゼント交換で自分のプレゼントに当たる確率
INPUT PROMPT "人数=":N
LET L=500 ! 試行回数
DIM A(N)
FOR J=1 TO L
LET P=INT(RND*N+1) ! 自分のプレゼント
FOR I=1 TO N
LET A(I)=I
NEXT I
FOR I=1 TO N
SWAP A(I),A(INT(RND*N+1)) ! プレゼント交換
NEXT I
IF A(P)=P THEN LET K=K+1 ! 自分のプレゼント
NEXT J
PRINT K/L*100;"%"
END
十進BASIC版:素数計数関数 pi(x)正確値計算プログラム - Tarosa
2026/03/20 (Fri) 21:15:08
プロセッサ Intel(R) Core(TM) i5-10210U CPU @ 1.60GHz (2.11 GHz)
実装 RAM 8.00 GB (7.84 GB 使用可能)
エディション Windows 11 Home
バージョン 25H2
タスクマネージャー(CPU 2.5GHz 前後 使用率25% 程度
BASIC Accelerator Ver. 1.2.2.6(2025.11.08)
Lazarus Windows 64ビット版/ Lazarus 4.6
lazarus-4.6-fpc-3.2.2-win64.exe
!十進BASIC版:素数計数関数 pi(x)正確値計算プログラム
DECLARE EXTERNAL FUNCTION PI_COUNT_EXACT
OPTION ARITHMETIC NATIVE
!OPTION ARITHMETIC RATIONAL
! --- 設定 ---
LET x = 10000000000000 ! 10兆 (10^13)
PRINT x; " の正確な素数個数を計算します。"
LET t0 = TIME
! --- メイン計算呼び出し ---
LET result = PI_COUNT_EXACT(x)
PRINT "------------------------------"
PRINT "結果(正確な値):"; result
PRINT "計算時間:"; TIME - t0; " 秒"
PRINT "------------------------------"
END
! --- 高速素数計数ルーチン (Lucy Hedgehog法) ---
EXTERNAL FUNCTION PI_COUNT_EXACT(n)
OPTION ARITHMETIC NATIVE
!OPTION ARITHMETIC RATIONAL
LET limit = INT(SQR(n))
! 1. 値の候補 (n/i) を抽出して配列のサイズを決定
! 10^13の場合、約632万個の要素が必要
LET num_values = 0
LET i1 = 1
DO WHILE i1 <= n
LET num_values = num_values + 1
LET v1 = INT(n / i1)
LET i1 = INT(n / v1) + 1
LOOP
! 配列の確保 (V: 値の保持, S: その値以下の素数個数)
DIM V(6400000)
DIM S(6400000)
! 2. 初期値の設定
LET idx = 0
LET i1 = 1
DO WHILE i1 <= n
LET idx = idx + 1
LET v1 = INT(n / i1)
LET V(idx) = v1
LET S(idx) = v1 - 1 ! 初期値は v1-1 (1を除く個数)
LET i1 = INT(n / v1) + 1
LOOP
LET max_idx = idx
! 3. エラトステネスの篩による更新
PRINT "計算開始... 要素数:"; max_idx
FOR p = 2 TO limit
! S(p) > S(p-1) なら p は素数
! 十進BASICではS(p)の直接参照が難しいため、Vの中からpの位置を探す
! 実際には p <= limit なので V の後ろの方にある
LET p_idx = max_idx - p + 1
IF S(p_idx) > S(p_idx + 1) THEN
LET sp_1 = S(p_idx + 1)
LET p2 = p * p
FOR j = 1 TO max_idx
IF V(j) < p2 THEN EXIT FOR
! V(j)/p がどこにあるか計算
LET next_v = INT(V(j) / p)
IF next_v <= LIMIT THEN
LET target_idx = max_idx - next_v + 1
ELSE
LET target_idx = INT(n / next_v)
END IF
LET S(j) = S(j) - (S(target_idx) - sp_1)
NEXT j
IF MOD(p, 5000) = 0 THEN
PRINT "現在 p="; p; " まで完了 /"; LIMIT
END IF
END IF
NEXT p
LET PI_COUNT_EXACT = S(1)
END FUNCTION
計算結果
10000000000000 の正確な素数個数を計算します。
計算開始... 要素数: 6324554
------------------------------
結果(正確な値): 346065536839
計算時間: 45.3410000000003 秒
------------------------------
346065536839 素数定理 参照
https://ja.wikipedia.org/wiki/%E7%B4%A0%E6%95%B0%E5%AE%9A%E7%90%86
LET x = 1000000000000 ! (10^12)
1000000000000 の正確な素数個数を計算します。
計算開始... 要素数: 1999999
------------------------------
結果(正確な値): 37607912018
計算時間: 8.12299999999232 秒
------------------------------
LET x = 100000000000 ! (10^11)
100000000000 の正確な素数個数を計算します。
計算開始... 要素数: 632454
------------------------------
結果(正確な値): 4118054813
計算時間: 1.59799999999814 秒
------------------------------
LET x = 10000000000 ! (10^10)
10000000000 の正確な素数個数を計算します。
計算開始... 要素数: 199999
------------------------------
結果(正確な値): 455052511
計算時間: 0.334000000002561 秒
------------------------------
Re: 十進BASIC版:素数計数関数 pi(x)正確値計算プログラム - しばっち
2026/04/05 (Sun) 07:54:18
私も素数個数関数をルジャンドル法で作ってみた。
とりあえずやっと動くようになりました。
まだ改良の余地はあるかとは思いますが
参考程度にはなるかと思います。
https://mathworld.wolfram.com/LegendresFormula.html
https://www.hs.chuo-u.ac.jp/contents/wp-content/themes/chu-fu/pdf/bulletin/issue30/issue30_pdf10.pdf
https://rosettacode.org/wiki/Legendre_prime_counting_function
OPTION BASE 0
LET N=1000000
PUBLIC NUMERIC PICACHE(10000),PRIME(10000),CACHE(10000,100),COUNT
MAT CACHE=(-1)*CON
CALL PRIMESIEVE(INT(SQR(N)))
PRINT π(N)
END
EXTERNAL SUB PRIMESIEVE(N)
MAT PICACHE=CON
LET PICACHE(1)=0
LET COUNT=0
FOR I=2 TO N
IF PICACHE(I)=1 THEN
LET COUNT=COUNT+1
LET PRIME(COUNT)=I
FOR J=I*I TO N STEP I
LET PICACHE(J)=0
NEXT J
END IF
NEXT I
FOR I=1 TO N-1
LET PICACHE(I+1)=PICACHE(I+1)+PICACHE(I)
NEXT I
END SUB
EXTERNAL FUNCTION φ(X,A)
IF X=0 THEN
LET φ=0
EXIT FUNCTION
END IF
IF X=1 THEN
LET φ=1
EXIT FUNCTION
END IF
IF A=1 THEN
LET φ=IP(X/2)
LET CACHE(X,1)=IP(X/2)
EXIT FUNCTION
END IF
IF A=2 THEN
LET φ=IP(X/3)
LET CACHE(X,2)=IP(X/3)
EXIT FUNCTION
END IF
IF A=3 THEN ! COMB(3,1)+COMB(3,2)+COMB(3,3) 2,3,5
LET S=X-IP(X/2)-IP(X/3)-IP(X/5)+IP(X/(2*3))+IP(X/(2*5))+IP(X/(3*5))-IP(X/(2*3*5))
LET φ=S
IF X<10000 THEN LET CACHE(X,3)=S
EXIT FUNCTION
END IF
IF A=4 THEN ! COMB(4,1)+COMB(4,2)+COMB(4,3)+COMB(4,4) 2,3,5,7
LET S=X-IP(X/2)-IP(X/3)-IP(X/5)-IP(X/7)+IP(X/(2*3))+IP(X/(2*5))+IP(X/(2*7))+IP(X/(3*5))+IP(X/(3*7))+IP(X/(5*7))-IP(X/(2*3*5))-IP(X/(2*3*7))-IP(X/(2*5*7))-IP(X/(3*5*7))+IP(X/(2*3*5*7))
LET φ=S
IF X<10000 THEN LET CACHE(X,4)=S
EXIT FUNCTION
END IF
IF A=5 THEN ! COMB(5,1)+COMB(5,2)+COMB(5,3)+COMB(5,4)+COMB(5,5) 2,3,5,7,11
LET S=X-IP(X/2)-IP(X/3)-IP(X/5)-IP(X/7)-IP(X/11)+IP(X/(2*3))+IP(X/(2*5))+IP(X/(2*7))+IP(X/(2*11))+IP(X/(3*5))+IP(X/(3*7))+IP(X/(3*11))+IP(X/(5*7))+IP(X/(5*11))+IP(X/(7*11))
LET S=S-IP(X/(2*3*5))-IP(X/(2*3*7))-IP(X/(2*3*11))-IP(X/(2*5*7))-IP(X/(2*5*11))-IP(X/(2*7*11))-IP(X/(3*5*7))-IP(X/(3*5*11))-IP(X/(3*7*11))-IP(X/(5*7*11))
LET S=S+IP(X/(2*3*5*7))+IP(X/(2*3*5*11))+IP(X/(2*3*7*11))+IP(X/(2*5*7*11))+IP(X/(3*5*7*11))-IP(X/(2*3*5*7*11))
LET φ=S
IF X<10000 THEN LET CACHE(X,5)=S
EXIT FUNCTION
END IF
IF X<10000 AND A<100 AND CACHE(X,A)<>-1 THEN
LET S=CACHE(X,A)
ELSE
LET S=φ(X,A-1)
IF X<10000 AND A<100 THEN LET CACHE(X,A)=S
END IF
LET XX=IP(X/PRIME(A))
IF XX<10000 AND A<100 AND CACHE(XX,A)<>-1 THEN
LET T=CACHE(XX,A)
ELSE
LET T=φ(XX,A-1)
IF XX<10000 AND A<100 THEN LET CACHE(XX,A)=T
END IF
LET φ=S-T
END FUNCTION
EXTERNAL FUNCTION π(X)
IF X<=PRIME(COUNT) THEN
LET π=PICACHE(X)
EXIT FUNCTION
END IF
!LET T=π(INT(SQR(X)))
LET T=COUNT
LET π=T+φ(X,T)-1
END FUNCTION
要望 - しばっち
2026/03/15 (Sun) 07:50:18
複素数モード時においてEXP(N*LOG(X))を
^(ペキ乗)で記述できるようにできませんか?
OPTION ARITHMETIC COMPLEX
LET X=-2.5
LET N=3.5
PRINT EXP(N*LOG(X)) ! OK
!PRINT X^N ! エラー
END
Re: 要望 - SHIRAISHI Kazuo
2026/03/15 (Sun) 13:16:47
X^N = EXP(N*LOG(X)) と定義してしまえば可能ですが,一般には負数の非整数乗は未定義とします。
たとえば,
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14250831054
要するに,値が1つに定まらないからで,0÷0を未定義にするのと同様の理屈です。
e=mc^2 - しばっち
2026/03/15 (Sun) 07:55:43
E=MC^2
アインシュタインの有名な方程式で計算してみた。
https://ja.wikipedia.org/wiki/質量とエネルギーの等価性
私は決してメタボではない(と思っている)がおなかの脂肪10Kgをエネルギーに変え電力にして
それを1KW/h=15円で売ったなら(3.7兆円 !?)一生遊んで暮らせるぞと思うのは私だけだろうか?
LET C=299792458 ! (m/s) 光速
INPUT PROMPT "質量(Kg)=":M
LET E=M*C^2
LET CAL=E/4.184 ! 4.184ジュール=1カロリー
CALL DISPLAY(E,"ジュール") ! J (Kg・m^2/s^2)
CALL DISPLAY(CAL,"カロリー")
CALL DISPLAY(CAL/100/1000,"キログラムの水を0度から100度に沸騰させる")
CALL DISPLAY(E/3600/1000,"キロワットh") ! KW・h
PRINT "買取価格 ";
CALL DISPLAY(E/3600/1000*15,"円") ! 1KW/h=15円
PRINT "東京ドーム ";
CALL DISPLAY(CAL/100/1240000000/1000,"杯分の水を沸騰させる") ! 東京ドーム1杯 1240000000リットル
END
EXTERNAL SUB DISPLAY(P,D$)
LET P$=USING$(REPEAT$("#",68),INT(P))
LET Q$=USING$(".####",FP(P))
DIM S$(18)
FOR I=LEN(P$) TO 1 STEP -4
LET N=N+1
LET S$(N)=P$(I-3:I)
LET S$(N)=LTRIM$(S$(N))
NEXT I
IF S$(2)<>"" THEN LET S$(2)=S$(2)&"万"
IF S$(3)<>"" THEN LET S$(3)=S$(3)&"億"
IF S$(4)<>"" THEN LET S$(4)=S$(4)&"兆"
IF S$(5)<>"" THEN LET S$(5)=S$(5)&"京"
IF S$(6)<>"" THEN LET S$(6)=S$(6)&"垓"
IF S$(7)<>"" THEN LET S$(7)=S$(7)&"じょ"
IF S$(8)<>"" THEN LET S$(8)=S$(8)&"穣"
IF S$(9)<>"" THEN LET S$(9)=S$(9)&"溝"
IF S$(10)<>"" THEN LET S$(10)=S$(10)&"澗"
IF S$(11)<>"" THEN LET S$(11)=S$(11)&"正"
IF S$(12)<>"" THEN LET S$(12)=S$(12)&"載"
IF S$(13)<>"" THEN LET S$(13)=S$(13)&"極"
IF S$(14)<>"" THEN LET S$(14)=S$(14)&"恒河沙"
IF S$(15)<>"" THEN LET S$(15)=S$(15)&"阿僧祇"
IF S$(16)<>"" THEN LET S$(16)=S$(16)&"那由他"
IF S$(17)<>"" THEN LET S$(17)=S$(17)&"不可思議"
IF S$(18)<>"" THEN LET S$(18)=S$(18)&"無料大数"
FOR I=18 TO 1 STEP -1
PRINT S$(I);
NEXT I
PRINT Q$;D$
END SUB
実行結果
質量(Kg)=10
89京8755兆1787億3681万7664.0000ジュール
21京4807兆6431億0153万3856.0000カロリー
2兆1480億7643万1015.3384キログラムの水を0度から100度に沸騰させる
2496億5421万6315.7827キロワットh
買取価格 3兆7448億1324万4736.7402円
東京ドーム 1732.3197杯分の水を沸騰させる
最上位桁の分布 - しばっち
2026/03/15 (Sun) 07:54:11
2^nの最上位桁の数字の分布
2^1~2^1000までの最上位桁の数字の分布を求めてみた。
DIM A(9)
FOR N=1 TO 1000
LET P=FP(N*LOG10(2)) ! 2^n
LET K=INT(10^P)
LET A(K)=A(K)+1
NEXT N
SET WINDOW -1,9,-10,350
DRAW GRID(1,50)
FOR I=1 TO 9
PLOT LINES:I,A(I);
NEXT I
END
------------------------------------------------------------
2^nの最上位から2桁目の数字の分布
DIM A(0 TO 9)
FOR I=1 TO 1000
LET P=FP(I*LOG10(2))
LET K=MOD(INT(10^P*10),10)
LET A(K)=A(K)+1
NEXT I
SET WINDOW -1,9,-10,200
DRAW GRID(1,50)
FOR I=0 TO 9
PLOT LINES:I,A(I);
NEXT I
END
------------------------------------------------------------
2^nの末尾桁の数字の分布
DIM A(0 TO 9)
LET K=1
FOR I=1 TO 1000
LET K=MOD(K*2,10)
LET A(K)=A(K)+1
NEXT I
SET WINDOW -1,9,-10,300
DRAW GRID(1,50)
FOR I=0 TO 9
PLOT LINES:I,A(I);
NEXT I
END
スーパー円 - しばっち
2026/03/15 (Sun) 07:52:42
スーパー円
OPTION ANGLE DEGREES
SET WINDOW -1,1,-1,1
LOCATE VALUE NOWAIT(1),RANGE 0 TO 2:N1
LOCATE VALUE NOWAIT(2),RANGE 0 TO 2:N2
!LOCATE VALUE NOWAIT(3),RANGE 0 TO 2:N3
LOCATE VALUE NOWAIT(4),RANGE 3 TO 20,AT 3:M
LOCATE VALUE NOWAIT(5),RANGE .1 TO 1:A
LOCATE VALUE NOWAIT(6),RANGE .1 TO 1:B
DO
LOCATE VALUE NOWAIT(1):N1
LOCATE VALUE NOWAIT(2):N2
! LOCATE VALUE NOWAIT(3):N3
LOCATE VALUE NOWAIT(4):M
LOCATE VALUE NOWAIT(5):A
LOCATE VALUE NOWAIT(6):B
LET N3=N2
DRAW GRID(.1,.1)
FOR T=0 TO 360
LET R=1/(ABS(1/A*COS(M/4*T))^N2+ABS(1/B*SIN(M/4*T))^N3)^(1/N1)
LET X=R*COS(T)
LET Y=R*SIN(T)
PLOT LINES:X,Y;
NEXT T
PLOT LINES
SET DRAW MODE EXPLICIT
WAIT DELAY .1
SET DRAW MODE HIDDEN
CLEAR
LOOP
END
-----------------------------------------------------------------------------------
OPTION ANGLE DEGREES
SET WINDOW -3,3,-3,3
DRAW GRID(1,1)
LET RR=1
LOCATE VALUE NOWAIT(1),RANGE 0 TO 1:A
LOCATE VALUE NOWAIT(2),RANGE 0 TO 1:B
LOCATE VALUE NOWAIT(3),RANGE 0 TO 1:C
LOCATE VALUE NOWAIT(4),RANGE 0 TO 360,AT 0:TH1
LOCATE VALUE NOWAIT(5),RANGE 0 TO 360,AT 0:TH2
LOCATE VALUE NOWAIT(6),RANGE 0 TO 360,AT 0:TH3
DO
LOCATE VALUE NOWAIT(1):A
LOCATE VALUE NOWAIT(2):B
LOCATE VALUE NOWAIT(3):C
LOCATE VALUE NOWAIT(4):TH1
LOCATE VALUE NOWAIT(5):TH2
LOCATE VALUE NOWAIT(6):TH3
DRAW GRID(1,1)
FOR T=0 TO 360
LET R=RR*(1+A*COS(T+TH1)+B*COS(2*T+TH2)+C*COS(3*T+TH3))
LET X=R*COS(T)
LET Y=R*SIN(T)
PLOT LINES:X,Y;
NEXT T
PLOT LINES
SET DRAW MODE EXPLICIT
WAIT DELAY .1
SET DRAW MODE HIDDEN
CLEAR
LOOP
END
COS模様 - しばっち
2026/03/15 (Sun) 07:51:41
色々なパターンの模様が描ける
PUBLIC NUMERIC L
SET POINT STYLE 1
LET SIZE=8
SET WINDOW -SIZE,SIZE,-SIZE,SIZE
ASK BITMAP SIZE XSIZE,YSIZE
LET L=XSIZE/SIZE
FOR N=1 TO 10
FOR M=1 TO 10
CLEAR
IF M<>N THEN
FOR Y=0 TO YSIZE
FOR X=0 TO XSIZE
IF ABS(F(X,Y,M,N))<.1 THEN
PLOT POINTS : WORLDX(X),WORLDY(Y)
END IF
NEXT X
NEXT Y
WAIT DELAY 1
END IF
NEXT M
NEXT N
END
EXTERNAL FUNCTION F(X,Y,M,N)
LET F=COS(N*X*PI/L)*COS(M*Y*PI/L)-COS(M*X*PI/L)*COS(N*Y*PI/L)
END FUNCTION
十進BASIC7.8.8の文字化け - た
2026/03/07 (Sat) 07:57:18
皆様、いつもありがとうございます。
初歩的な質問で申し訳ございません。
最新バージョンの7.8.8にて、文字化けが発生します。
最初は、日本語が「???」で全く表示されなかったのですが、OSのローケルや表示を日本語優先にすることである程度は直りましたが、一部、文字化けが治りません。
該当文字列だけ、文字コードが異なるのではないかと推定しております。
ほかに直し方がお分かりでしたら、お教えいただけますでしょうか。
OS:Windows 11 Pro 25H2 26200.7840
よろしくお願いいたします。
Re: 十進BASIC7.8.8の文字化け - SHIRAISHI Kazuo
2026/03/07 (Sat) 10:17:04
7.8.8以前のバージョンでは問題ないのでしょうか。
ver. 7.8.7.7と7.8.7.6が https://decimalbasic.web.fc2.com/basicw32.htm から入手可能です。
なお,Windows 11 Home 25H2 26200.7840 でテストする範囲では正常です。
Re: 十進BASIC7.8.8の文字化け - knoike
2026/03/07 (Sat) 12:39:21
knoike です。ここでは初めて書き込みます。
設定 → 時刻と言語 → 言語と地域
で、
[Windows の表示言語] の右端の v をクリックして展開される項目の
[ベータ版: 世界中の言語に対応するために Unicode UTF-8 を使用します]
が
[オン] になっていると化けます。
デフォルトは [オフ] で、[オフ] なら化けません。正常に表示されます。
「OSのローケルや表示を日本語優先にすることである程度は直りましたが、」という書き込みから、
言語パックをいくつかインストールしてあるのだと想像していますが、
たいていのアプリはここの設定が [オフ] のままで正常に表示できるような多言語対応がなされていると思いますので、
特別な事情がない限りは [オフ] にしておくとよいのではないでしょうか。
Re: 十進BASIC7.8.8の文字化け - た
2026/03/07 (Sat) 20:44:35
ありがとうございます。
>SHIRAISHI Kazuo さん
旧バージョンを試してみましたが、結果は同じでした。
>knoikeさん
ご指摘の部分がONでしたので、OFFにしてみましたが、改善は見られませんでした。
みなさん、ご指摘の通り、私のwindows 11の環境が怪しそうなので、まず、OS周りで不具合がないか、一度確認してみます。
ありがとうございました。
Re: 十進BASIC7.8.8の文字化け - た
2026/03/07 (Sat) 20:53:31
今、試しで、「十進BASIC ver. 8」を使ってみたら、全く文字化けがありません。
文字コードがutf-8に対応した、ということですが、Version 7の中の別の文字コードが化けている可能性があるのでは、と推定しています。
現時点で、Version 8であれば文字化けは発生しませんので、当面はこちらを使いたいと思います。
ありがとうございました。
Re: 十進BASIC7.8.8の文字化け - SHIRAISHI Kazuo
2026/03/08 (Sun) 07:55:50
設定 → 時刻と言語 → 言語と地域 [ベータ版: 世界中の言語に対応するために Unicode UTF-8 を使用します] を試してみました。
投稿された通りの結果になります。
Ver.7は内部でshift-JISを採用しています。また,「機能語挿入」の内容部分は BASIC.kwFとBASIC.kwSから読み込んでいます。
BASIC.kwFとBASIC.kwSはshift-JISで書かれているので文字化けして当然ですが,それ以外の部分はβ版で未対応なのだろうと思います。
なお,Ver.7 日本語版の翻訳系は,文字コードがShift-JISであることを前提にしています。UTF-8の文字を含むプログラムは,おそらく正常に実行できません。
Re: 十進BASIC7.8.8の文字化け - SHIRAISHI Kazuo
2026/03/08 (Sun) 11:59:40
十進BASIC Ver.8は,内部文字コードがUTF-8ですが,Windows APIは16ビットwide文字対応版を使うので,Windowsのlocaleの影響を受けません。
BASICAccなども同様です。
Re: 十進BASIC7.8.8の文字化け - SHIRAISHI Kazuo
2026/03/09 (Mon) 09:21:33
十進BASIC ver.8(日本語版)はWindowsのコードページ設定に関係なく日本語で動作します。
Ver.8でもWindows APIの呼び出しが使えます。
https://decimalbasic.web.fc2.com/ExtDLL.htm
WindowsAPIのMessageBoxAは,ANSI文字でメッセージボックスを表示します。
WindowsのANSI文字というのは,Windowsのコードページごとに定まる文字のことで,日本語版WindowsではShift-JISのことです。
DECLARE EXTERNAL FUNCTION MesBox
LET n=MesBox(0,"日本語","BASIC",3)
PRINT n
END
EXTERNAL FUNCTION MesBox(owner,text$,caption$,flag)
ASSIGN "user32.dll","MessageBoxA"
END FUNCTION
をVer.8で実行すると文字化けします(Ver.8で"日本語"がUTF-8文字なので)。
"日本語" のところを ANSI$("日本語") に変えると正常に機能します。
ANSI$関数は,コードページの指定にしたがってUTF-8文字列をANSI文字列に変える関数です。
MessageBoxAの説明は
https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-messageboxa
にあります。
「世界中の言語に対応するために Unicode UTF-8 を使用します」の意味は,ANSI文字としてUTF-8を採用することのように思われます。
Ver.8はWindowsの言語設定を変えても動作するので,テストしてみていただけないでしょうか。
Re: 十進BASIC7.8.8の文字化け - た
2026/03/14 (Sat) 19:05:46
返信が遅くなり、申し訳ございません。
承知しました。
WindowsAPIの利用含め、Version.8を一通り試して、何か気が付いた点がございましたら、また報告させていただきます。
お時間いただきまして、ありがとうございました。
よろしくお願いいたします。
ローテートパズル - しばっち
2026/03/01 (Sun) 07:47:11
バラバラになった数字をローテートさせながら
数字を揃えるパズルです。
シャッフル回数を入れるとゲーム開始です。
マウスで矢印をクリックすると数字がローテーション
します。
Rキーでリトライ(リスタート)
Gキーでギブアップになります。
DECLARE FUNCTION CHECK
RANDOMIZE
CALL GINIT(800,800)
LET SIZE=3
DIM M(SIZE,SIZE),T(SIZE,SIZE),XS(50),YS(50),NS(50)
SET TEXT JUSTIFY "CENTER","HALF"
SET TEXT BACKGROUND "OPAQUE"
FOR J=1 TO SIZE
FOR I=1 TO SIZE
LET M(I,J)=SIZE*(J-1)+I
NEXT I
NEXT J
CALL DISPLAY
CALL DISPLAY2(0,0)
INPUT PROMPT "シャッフル回数(5-50)=":NN
FOR K=1 TO NN ! 問題作成
LET X=INT(RND*3+1)
LET Y=INT(RND*3+1)
LET N=INT(RND*4+1)
CALL ROTATE(N,X,Y)
LET XS(K)=X
LET YS(K)=Y
IF N=1 OR N=2 THEN
LET NS(K)=3-N
END IF
IF N=3 OR N=4 THEN
LET NS(K)=7-N
END IF
CALL DISPLAY
WAIT DELAY .1
NEXT K
MAT T=M ! 面データコピー
DO ! ゲーム開始
CLEAR
CALL DISPLAY
CALL DISPLAY2(0,0)
SET DRAW MODE EXPLICIT
IF CHECK=1 THEN EXIT DO ! 揃ったら
DO
IF GETKEYSTATE(ORD("R"))<0 OR GETKEYSTATE(ORD("r"))<0 THEN ! リトライ(リスタート)
MAT M=T
CALL DISPLAY
END IF
IF GETKEYSTATE(ORD("G"))<0 OR GETKEYSTATE(ORD("g"))<0 THEN ! ギブアップ
MAT M=T
CALL DISPLAY
FOR K=NN TO 1 STEP -1 ! 解答表示
CALL ROTATE(NS(K),XS(K),YS(K))
CALL DISPLAY
CALL DISPLAY2(100+300/SIZE+600/SIZE*(XS(K)-1),100+300/SIZE+600/SIZE*(YS(K)-1))
WAIT DELAY .5
NEXT K
STOP
END IF
MOUSE POLL MX,MY,LEFT,RIGHT ! マウス入力
LOOP UNTIL LEFT=1 OR RIGHT=1 ! クリックしたら
DO
MOUSE POLL MX,MY,LEFT,RIGHT
LOOP WHILE LEFT=1 OR RIGHT=1
CALL DISPLAY2(MX,MY)
IF MX<100 THEN
LET Y=INT((MY-100)/(600/SIZE))+1
CALL ROTATE(1,X,Y)
END IF
IF MX>700 THEN
LET Y=INT((MY-100)/(600/SIZE))+1
CALL ROTATE(2,X,Y)
END IF
IF MY<100 THEN
LET X=INT((MX-100)/(600/SIZE))+1
CALL ROTATE(3,X,Y)
END IF
IF MY>700 THEN
LET X=INT((MX-100)/(600/SIZE))+1
CALL ROTATE(4,X,Y)
END IF
SET DRAW MODE HIDDEN
WAIT DELAY .3
LOOP
SET TEXT HEIGHT 80
SET TEXT BACKGROUND "TRANSPARENT"
SET TEXT COLOR 2
PLOT TEXT ,AT 400,400:"Congratulations"
SUB DISPLAY ! 画面表示
SET LINE COLOR 7
SET TEXT COLOR 7
SET TEXT HEIGHT 300/SIZE
SET TEXT BACKGROUND "OPAQUE"
FOR X=100 TO 700 STEP 600/SIZE
PLOT LINES : X,0;X,800
NEXT X
FOR Y=100 TO 700 STEP 600/SIZE
PLOT LINES : 0,Y;800,Y
NEXT Y
FOR J=1 TO SIZE
FOR I=1 TO SIZE
PLOT TEXT ,AT 100+300/SIZE+600/SIZE*(I-1),100+300/SIZE+600/SIZE*(J-1):USING$("##",M(I,J))
NEXT I
NEXT J
END SUB
SUB DISPLAY2(X,Y) ! 矢印表示
SET TEXT HEIGHT 50
SET TEXT BACKGROUND "TRANSPARENT"
FOR I=1 TO SIZE
IF X<100 AND Y>100+600/SIZE*(I-1) AND Y<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(0,100+600/SIZE*(I-1),100,100+600/SIZE*I,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 50,100+300/SIZE+600/SIZE*(I-1):"←"
NEXT I
FOR I=1 TO SIZE
IF X>700 AND Y>100+600/SIZE*(I-1) AND Y<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(700,100+600/SIZE*(I-1),800,100+600/SIZE*I,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 750,100+300/SIZE+600/SIZE*(I-1):"→"
NEXT I
FOR I=1 TO SIZE
IF Y<100 AND X>100+600/SIZE*(I-1) AND X<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(100+600/SIZE*(I-1),0,100+600/SIZE*I,100,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 100+300/SIZE+600/SIZE*(I-1),50:"↑"
NEXT I
FOR I=1 TO SIZE
IF Y>700 AND X>100+600/SIZE*(I-1) AND X<100+600/SIZE*I THEN
SET TEXT COLOR 2
CALL BOXFULL(100+600/SIZE*(I-1),700,100+600/SIZE*I,800,5)
ELSE
SET TEXT COLOR 4
END IF
PLOT TEXT ,AT 100+300/SIZE+600/SIZE*(I-1),750:"↓"
NEXT I
END SUB
SUB ROTATE(N,X,Y) ! 回転
SELECT CASE N
CASE 1 ! LEFT
LET TEMP=M(1,Y)
FOR I=1 TO SIZE-1
LET M(I,Y)=M(I+1,Y)
NEXT I
LET M(SIZE,Y)=TEMP
CASE 2 ! RIGHT
LET TEMP=M(SIZE,Y)
FOR I=SIZE-1 TO 1 STEP -1
LET M(I+1,Y)=M(I,Y)
NEXT I
LET M(1,Y)=TEMP
CASE 3 ! UP
LET TEMP=M(X,1)
FOR I=1 TO SIZE-1
LET M(X,I)=M(X,I+1)
NEXT I
LET M(X,SIZE)=TEMP
CASE 4 ! DOWN
LET TEMP=M(X,SIZE)
FOR I=SIZE-1 TO 1 STEP -1
LET M(X,I+1)=M(X,I)
NEXT I
LET M(X,1)=TEMP
END SELECT
END SUB
FUNCTION CHECK ! 揃ったか?
FOR J=1 TO SIZE
FOR I=1 TO SIZE
IF M(I,J)<>SIZE*(J-1)+I THEN
LET CHECK=0
EXIT FUNCTION
END IF
NEXT I
NEXT J
LET CHECK=1
END FUNCTION
END
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
EXTERNAL SUB BOXFULL(X1,Y1,X2,Y2,C)
SET AREA COLOR C
PLOT AREA:X1,Y1;X2,Y1;X2,Y2;X1,Y2;X1,Y1
END SUB
arm版Windows11 - SHIRAISHI Kazuo
2026/02/15 (Sun) 10:09:28
arm版Windows11で,十進BASIC Ver.7,ver.8 は正しく動作しません。FPU例外(0除算,桁あふれなど)の処理に問題があります。
BASIC generic Ver. 0.9 Win64版はx86_64向けにコンパイルしたものですが,FPU例外を利用しないので,arm版Windows11でも動作します。
ただし,テストが十分とはいえないので,arm版Windows11での動作に疑義を見つけた方は報告をお願いします。
Windowsの仕様は,
「スタート」メニューから「設定」(歯車アイコン)
「システム」
「バージョン情報」
で確認できます。
Re: arm版Windows11 - SHIRAISHI Kazuo
2026/02/16 (Mon) 08:45:54
テストプログラムです。
10 OPTION ARITHMETIC NATIVE
20 LET x=0
30 WHEN EXCEPTION IN
40 PRINT 1/x
50 USE
60 PRINT "正常"
70 END WHEN
80 END
Ver.7 をarm版Winows11で実行すると,このテストプログラムでフリーズします。
Ver.8 だとこのテストは通過しますが,複素数モードのサンプルプログラムMU_COSH.BASやMANDELBL.BASを実行するとすべて黒で塗りつぶされてしまいます。
テスト環境は,MAC (Apple Silicon) 上のVrtualBox上のWindows11 Canary です。
実機だと異なる結果になるかもしれません。実機 Windows on arm での動作報告を期待(歓迎)します。
Re: arm版Windows11 - SHIRAISHI Kazuo
2026/02/16 (Mon) 20:24:22
MAC (Apple Silicon) 上のVrtualBox上のWindows11 Canaryにおいて,十進BASIC Ver.8(Windows版)で
10 OPTION ARITHMETIC NATIVE
20 LET x=0
30 WHEN EXCEPTION IN
40 PRINT 1/x
50 USE
60 PRINT EXTYPE
70 END WHEN
80 END
を実行すると,結果が1002になります。3001が得られるのが正しいので,Ver.8に対しても,FPU例外のエミュレーションに不具合があるように思います。
ただし,Apple SiliconとWindows機のarmとでは浮動小数点例外の扱いが異なることが原因の可能性もあります。実機版 Windows on arm での動作報告を期待します。