a4_log
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* acl4の開発ログ
-(by [[K]], 2026.03.14)
-''acl4開発のもくじ → [[a4_i01]]''
-開発ログの過去ログのもくじ → [[a4_log00]]
-一番新しい過去ログ(=このページの直前の話題) → [[a4_lo...
-一番新しい過去ログ(=このページの直前の話題) → [[a4_lo...
** 2026.03.18(水) #0
-(主に自分のために)構想の全体像をまとめておきます。
-[1]ソースコードをプリプロセッサ向きの形式に変換する(tt0...
--これは上記に雑なサンプルがあるので、雰囲気はわかっても...
-[2]ローカル変数・ローカルラベルなどを解決して、すべてグ...
--関数funcの中のabcというローカル変数なら _@func_@abc と...
-[3]改造プリプロセッサにより前方参照とマクロ展開をやる。
--一時変数の型を決めるためのマクロの適用・型を決めた上で...
** 2026.03.18(水) #1
-ちょっと最適化が必要そうだなあと思ったところ:
Add(tmp5, s, tmp4);
Let(s, tmp5);
→ Add(s, s, tmp4);
Add(tmp3, j, 1);
Let(j, tmp3);
→ Add(j, j, 1);
Add(tmp1, i, 1);
Let(i, tmp1);
→ Add(i, i, 1);
-このレベルの最適化だけをぱぱっとやってしまうレイヤ(=関...
** 2026.03.18(水) #2
-自分用にアイデアメモ:
--まず変数 i が、 Int:memstk+1234 に変換される。
--Add(i, i, ConstInt:1); が Add_IntMemstk_IntMemstk_Const...
--Mov_RS(EAX,1234); Add_RI(EAX,1); Mov_SR(1234,EAX); に変...
** 2026.03.26(木) #0
-大変唐突ですが、変数宣言とかしなくてもデフォルトで有理数...
-(いや本気で作るわけではないです。ネタです。)
-たぶんここまでで作ったものを生かせば簡単に作れるはず。
-よし今日はそれで遊ぼう!
-そもそも発端は、以下の連立方程式を、xにいろんな数を入れ...
a=x/2+3
b=(x-a)/3+2
c=(x-a-b)/4+2
x=a+b+c+7
** 2026.03.26(木) #1
-Python のライブラリに limit_denominator というメソッドが...
-浮動小数点数を与えると、指定した分母の範囲で一番近い有理...
-これはいいなと思いました。これが使えるなら、普段はdouble...
-それなら有理数型はなくても平気です。
-しかもこの関数があれば、sqrt(2)とか円周率とかに対して、...
//-有理数型の強みとしては、桁落ち誤差が全く生じないという...
** 2026.03.26(木) #2
-とりあえず、こんなプログラムを書いてアルゴリズムが正しい...
// tt0004a.c
#define a_Version 1
#include <acl4.c>
int64_t limit_denominator_sub(int64_t *ary, int n, int64...
// nは配列の長さではなく、それよりも1小さい数を渡す. つ...
{
int i;
int64_t a = ary[n], b = 1, t;
for (i = n - 1; i >= 0; i--) {
t = ary[i] * a + b;
b = a;
a = t;
}
*pb = b;
#if 0
printf("n=%d [", n);
for (i = 0; i <= n; i++) printf("%d ", (int) ary[i]);
printf("] %d/%d\n", (int) a, (int) b);
#endif
return a;
}
int64_t limit_denominator(double x, int64_t bMax, int64_...
{
if (x == 0.0) { *pb = 1; return 0; }
int sign = 1, i;
if (x < 0.0) { sign = -1; x *= -1.0; }
int64_t ary[1024], a = 0, b = 0, ta, tb;
for (i = 0; i < 1024; i++) {
ary[i] = (int64_t) x;
ta = limit_denominator_sub(ary, i, &tb);
if (tb > bMax) break;
a = ta; b = tb;
if (i == 1023) break;
x -= (double) ary[i];
if (x < 1e-12) break;
x = 1.0 / x;
}
*pb = b;
return a * sign;
}
int main()
{
int64_t a, b;
double x = 3.14159265358979323;
a = limit_denominator(x, 10, &b); printf("%d/%d\n"...
a = limit_denominator(x, 100, &b); printf("%d/%d\n"...
a = limit_denominator(x, 1000, &b); printf("%d/%d\n\...
x = sqrt(2);
a = limit_denominator(x, 10, &b); printf("%d/%d\n"...
a = limit_denominator(x, 100, &b); printf("%d/%d\n"...
a = limit_denominator(x, 1000, &b); printf("%d/%d\n\...
x = exp(1);
a = limit_denominator(x, 10, &b); printf("%d/%d\n"...
a = limit_denominator(x, 100, &b); printf("%d/%d\n"...
a = limit_denominator(x, 1000, &b); printf("%d/%d\n\...
return 0;
}
// 実行結果
>tt0004a
22/7
22/7
355/113
7/5
99/70
1393/985
19/7
193/71
1457/536
-とりあえずそれっぽく動いているので、アルゴリズムは悪くな...
-このアルゴリズムを一応説明しておくと、与えられた実数を連...
--連分数についてはこちらを参考にしています。 https://ja.w...
-なぜこのアルゴリズムにしたのかというと、計算量が少なそう...
** 2026.03.26(木) #3
-ということでこれで行けそうと思ったのですが、このページの...
-https://note.nkmk.me/python-fractions-usage/#pie
--(こういう情報があるのはとてもありがたいです。)
-違うのは、円周率に対して、 print(pi.limit_denominator(10...
-それ以外の結果は一致しています。
-つまり Python は違うアルゴリズムを採用しているのだと思い...
** 2026.03.26(木) #4
-この結果を踏まえると、 Python と同じ結果を出すことを頑張...
--そのほうがプログラムは簡単になります。
// tt0004b.c
int64_t limit_denominator2(double x, int64_t bMin, int64...
{
if (x == 0.0) { *pb = 1; return 0; }
int sign = 1, i;
if (x < 0.0) { sign = -1; x *= -1.0; }
int64_t ary[1024], a, b;
for (i = 0; i < 1024; i++) {
ary[i] = (int64_t) x;
a = limit_denominator_sub(ary, i, &b);
if (b >= bMin || i == 1023) break;
x -= (double) ary[i];
if (x < 1e-12) break;
x = 1.0 / x;
}
*pb = b;
return a * sign;
}
-そもそもは、「無理数をいい感じに近似できる有理数を探す」...
-と思ったのですが、 limit_denominator2() は実用的ではない...
-たとえば総当たり方式で解を探すと、 3x=1 に対する仮の答え...
-ここから有理数に戻そうと limit_denominator2(10) とかする...
-これに対して、 limit_denominator(99) なら正しく 1/3 が得...
** 2026.03.26(木) #5
-以下を見ると Python の limit_denominator() は複雑なアル...
-https://stackoverflow.com/questions/13437589/how-is-pyth...
** 2026.03.27(金) #0
-ええとまず「失言ドリブン」という話をさせてください。
-私はかつて TONWS用PC98エミュレータ「V98」というソフトウ...
-なぜこれを作ったのかということですが、まず自分の家には98...
-当時の私はTOWNSが大好きで(今も好きですよ、もちろん)、P...
-それで「ちょっと迷ったけど、たぶんわからないことがあった...
-それで友人たちが後悔するとかそういうことはなかったのです...
-言ったからにはやらなきゃいけないわけです(とはいえ、友人...
-この話で私が伝えたいのは「軽率な失言をすると、やむを得な...
~
-私は今年に入ってから、軽率な約束を2つしています。それを...
--Buntan-PCプロジェクトのためのCコンパイラを、私が年内に...
--OSASKのアプリケーションのkaodunを逆アセンブルなどで解析...
** 2026.03.27(金) #1
-なんか適当に1時間くらいやれば、浮動小数点を基本型にもつ...
** 2026.03.29(日) #0
-a4vmの本番用の仮想マシンを作っているのですが、再帰処理で...
** 2026.03.29(日) #1
-よし直ったー。
** 2026.03.30(月) #0
-[[a4_0014]]に書いたサンプルプログラムの t0014a.c は、思...
-明日にはプログラム例を書きます。
** 2026.03.31(火) #0
-[[a4_0014]](A4vm_exec0など)を書きました。これで何がで...
** 2026.03.31(火) #1
-ここから、プリプロセッサの連鎖でコンパイラを構築するって...
** 2026.04.01(水) #0
-今日は病気でお休み。
** 2026.04.01(水) #1
-いきなり理想形を考えるのではなく、まずは現状のプリプロセ...
** 2026.04.02(木) #0
-変換手順(妄想・暫定版)
[1]
int i, s;
for (i = 0; i < 10; i++)
s += i;
[2]
#define i Int:R00
#define s Int:R01
Lod(i, CInt:0); Lbl(Txt:LT0001);
Add(s, i);
Add(i, CInt:1); Jlt(i, CInt:10, Txt:LT0001);
[3]
Lod(Int:R00, CInt:0); Lbl(Txt:LT0001); Add(Int:R01, Int:...
[4]
Lod_RI(R00, 0); Lbl_T(LT0001); Add_RR(R01, R00); Add_RI(...
[5]
Lod_RI(R00, 0); Lbl_T(LT0001); Add_RRR(R01, R01, R00); A...
-うん、これくらいなら作れそうな気がします。
-まず[4]→[5]は簡単です。
#define Add_RR(r, s) Add_RRR(r, r, s)
-みたいなのをたくさん書けばいいだけだからです。
-それで[3]→[4]をやるには、型付きdefineを作らないといけま...
#typedDef Lod(Int:r, CInt:i) Lod_RI(r, i)
#typedDef Lod(Int:r, Int:s) Lod_RR(r, s)
-では[2]→[3]はどうかというと、これは普通のプリプロセッサ...
-残った[1]→[2]は、これはプリプロセッサではなくて言語です。
** 2026.04.02(金) #1
-[Q] これでCコンパイラができそうなことはなんとなくわかり...
-[A] [1]→[2]の変換を見てください。コンパイラはiやsの型を...
-一方で、この型の組み合わせの加算の時はこれに変換する、と...
-型の追加だって思いのままです。String型やComplex型、Vecto...
-C++のoperatorっぽいことができるわけです。
** 2026.04.02(金) #2
-[1]自分の作品に「主要なテーマ」があるととてもいいと思っ...
-たとえば料理を作るのなら、「〇〇産のこの野菜がとてもおい...
-絵を描くにしても、「この笑顔が忘れられない。これを最大限...
-[2]私がOS自作をしようと思ったとき(第一世代OSASKのとき)...
-まず32bitというレジスタ幅に感動しました。16bitでは64KBを...
-そもそもメモリが64KBとか1MBしか使えないっていう8086は狭...
-新しくなったセグメンテーションもとても感激しました。メモ...
-実行速度は高速でした。特にi486はとんでもなく速いと感じま...
-私はこのCPUの機能を生かし切るためのOSを作ってやろう!と...
-結果としてとても面白いOSができたと思っています。
-[3]最近は移植性が大事で、特定のハードウェアや特定のOSに...
-[4]acl4は何がテーマでしょうか。・・・まず、テーマより前...
-じゃあテーマは何かというと、C言語だけでもここまでできる...
* こめんと欄
#comment
終了行:
* acl4の開発ログ
-(by [[K]], 2026.03.14)
-''acl4開発のもくじ → [[a4_i01]]''
-開発ログの過去ログのもくじ → [[a4_log00]]
-一番新しい過去ログ(=このページの直前の話題) → [[a4_lo...
-一番新しい過去ログ(=このページの直前の話題) → [[a4_lo...
** 2026.03.18(水) #0
-(主に自分のために)構想の全体像をまとめておきます。
-[1]ソースコードをプリプロセッサ向きの形式に変換する(tt0...
--これは上記に雑なサンプルがあるので、雰囲気はわかっても...
-[2]ローカル変数・ローカルラベルなどを解決して、すべてグ...
--関数funcの中のabcというローカル変数なら _@func_@abc と...
-[3]改造プリプロセッサにより前方参照とマクロ展開をやる。
--一時変数の型を決めるためのマクロの適用・型を決めた上で...
** 2026.03.18(水) #1
-ちょっと最適化が必要そうだなあと思ったところ:
Add(tmp5, s, tmp4);
Let(s, tmp5);
→ Add(s, s, tmp4);
Add(tmp3, j, 1);
Let(j, tmp3);
→ Add(j, j, 1);
Add(tmp1, i, 1);
Let(i, tmp1);
→ Add(i, i, 1);
-このレベルの最適化だけをぱぱっとやってしまうレイヤ(=関...
** 2026.03.18(水) #2
-自分用にアイデアメモ:
--まず変数 i が、 Int:memstk+1234 に変換される。
--Add(i, i, ConstInt:1); が Add_IntMemstk_IntMemstk_Const...
--Mov_RS(EAX,1234); Add_RI(EAX,1); Mov_SR(1234,EAX); に変...
** 2026.03.26(木) #0
-大変唐突ですが、変数宣言とかしなくてもデフォルトで有理数...
-(いや本気で作るわけではないです。ネタです。)
-たぶんここまでで作ったものを生かせば簡単に作れるはず。
-よし今日はそれで遊ぼう!
-そもそも発端は、以下の連立方程式を、xにいろんな数を入れ...
a=x/2+3
b=(x-a)/3+2
c=(x-a-b)/4+2
x=a+b+c+7
** 2026.03.26(木) #1
-Python のライブラリに limit_denominator というメソッドが...
-浮動小数点数を与えると、指定した分母の範囲で一番近い有理...
-これはいいなと思いました。これが使えるなら、普段はdouble...
-それなら有理数型はなくても平気です。
-しかもこの関数があれば、sqrt(2)とか円周率とかに対して、...
//-有理数型の強みとしては、桁落ち誤差が全く生じないという...
** 2026.03.26(木) #2
-とりあえず、こんなプログラムを書いてアルゴリズムが正しい...
// tt0004a.c
#define a_Version 1
#include <acl4.c>
int64_t limit_denominator_sub(int64_t *ary, int n, int64...
// nは配列の長さではなく、それよりも1小さい数を渡す. つ...
{
int i;
int64_t a = ary[n], b = 1, t;
for (i = n - 1; i >= 0; i--) {
t = ary[i] * a + b;
b = a;
a = t;
}
*pb = b;
#if 0
printf("n=%d [", n);
for (i = 0; i <= n; i++) printf("%d ", (int) ary[i]);
printf("] %d/%d\n", (int) a, (int) b);
#endif
return a;
}
int64_t limit_denominator(double x, int64_t bMax, int64_...
{
if (x == 0.0) { *pb = 1; return 0; }
int sign = 1, i;
if (x < 0.0) { sign = -1; x *= -1.0; }
int64_t ary[1024], a = 0, b = 0, ta, tb;
for (i = 0; i < 1024; i++) {
ary[i] = (int64_t) x;
ta = limit_denominator_sub(ary, i, &tb);
if (tb > bMax) break;
a = ta; b = tb;
if (i == 1023) break;
x -= (double) ary[i];
if (x < 1e-12) break;
x = 1.0 / x;
}
*pb = b;
return a * sign;
}
int main()
{
int64_t a, b;
double x = 3.14159265358979323;
a = limit_denominator(x, 10, &b); printf("%d/%d\n"...
a = limit_denominator(x, 100, &b); printf("%d/%d\n"...
a = limit_denominator(x, 1000, &b); printf("%d/%d\n\...
x = sqrt(2);
a = limit_denominator(x, 10, &b); printf("%d/%d\n"...
a = limit_denominator(x, 100, &b); printf("%d/%d\n"...
a = limit_denominator(x, 1000, &b); printf("%d/%d\n\...
x = exp(1);
a = limit_denominator(x, 10, &b); printf("%d/%d\n"...
a = limit_denominator(x, 100, &b); printf("%d/%d\n"...
a = limit_denominator(x, 1000, &b); printf("%d/%d\n\...
return 0;
}
// 実行結果
>tt0004a
22/7
22/7
355/113
7/5
99/70
1393/985
19/7
193/71
1457/536
-とりあえずそれっぽく動いているので、アルゴリズムは悪くな...
-このアルゴリズムを一応説明しておくと、与えられた実数を連...
--連分数についてはこちらを参考にしています。 https://ja.w...
-なぜこのアルゴリズムにしたのかというと、計算量が少なそう...
** 2026.03.26(木) #3
-ということでこれで行けそうと思ったのですが、このページの...
-https://note.nkmk.me/python-fractions-usage/#pie
--(こういう情報があるのはとてもありがたいです。)
-違うのは、円周率に対して、 print(pi.limit_denominator(10...
-それ以外の結果は一致しています。
-つまり Python は違うアルゴリズムを採用しているのだと思い...
** 2026.03.26(木) #4
-この結果を踏まえると、 Python と同じ結果を出すことを頑張...
--そのほうがプログラムは簡単になります。
// tt0004b.c
int64_t limit_denominator2(double x, int64_t bMin, int64...
{
if (x == 0.0) { *pb = 1; return 0; }
int sign = 1, i;
if (x < 0.0) { sign = -1; x *= -1.0; }
int64_t ary[1024], a, b;
for (i = 0; i < 1024; i++) {
ary[i] = (int64_t) x;
a = limit_denominator_sub(ary, i, &b);
if (b >= bMin || i == 1023) break;
x -= (double) ary[i];
if (x < 1e-12) break;
x = 1.0 / x;
}
*pb = b;
return a * sign;
}
-そもそもは、「無理数をいい感じに近似できる有理数を探す」...
-と思ったのですが、 limit_denominator2() は実用的ではない...
-たとえば総当たり方式で解を探すと、 3x=1 に対する仮の答え...
-ここから有理数に戻そうと limit_denominator2(10) とかする...
-これに対して、 limit_denominator(99) なら正しく 1/3 が得...
** 2026.03.26(木) #5
-以下を見ると Python の limit_denominator() は複雑なアル...
-https://stackoverflow.com/questions/13437589/how-is-pyth...
** 2026.03.27(金) #0
-ええとまず「失言ドリブン」という話をさせてください。
-私はかつて TONWS用PC98エミュレータ「V98」というソフトウ...
-なぜこれを作ったのかということですが、まず自分の家には98...
-当時の私はTOWNSが大好きで(今も好きですよ、もちろん)、P...
-それで「ちょっと迷ったけど、たぶんわからないことがあった...
-それで友人たちが後悔するとかそういうことはなかったのです...
-言ったからにはやらなきゃいけないわけです(とはいえ、友人...
-この話で私が伝えたいのは「軽率な失言をすると、やむを得な...
~
-私は今年に入ってから、軽率な約束を2つしています。それを...
--Buntan-PCプロジェクトのためのCコンパイラを、私が年内に...
--OSASKのアプリケーションのkaodunを逆アセンブルなどで解析...
** 2026.03.27(金) #1
-なんか適当に1時間くらいやれば、浮動小数点を基本型にもつ...
** 2026.03.29(日) #0
-a4vmの本番用の仮想マシンを作っているのですが、再帰処理で...
** 2026.03.29(日) #1
-よし直ったー。
** 2026.03.30(月) #0
-[[a4_0014]]に書いたサンプルプログラムの t0014a.c は、思...
-明日にはプログラム例を書きます。
** 2026.03.31(火) #0
-[[a4_0014]](A4vm_exec0など)を書きました。これで何がで...
** 2026.03.31(火) #1
-ここから、プリプロセッサの連鎖でコンパイラを構築するって...
** 2026.04.01(水) #0
-今日は病気でお休み。
** 2026.04.01(水) #1
-いきなり理想形を考えるのではなく、まずは現状のプリプロセ...
** 2026.04.02(木) #0
-変換手順(妄想・暫定版)
[1]
int i, s;
for (i = 0; i < 10; i++)
s += i;
[2]
#define i Int:R00
#define s Int:R01
Lod(i, CInt:0); Lbl(Txt:LT0001);
Add(s, i);
Add(i, CInt:1); Jlt(i, CInt:10, Txt:LT0001);
[3]
Lod(Int:R00, CInt:0); Lbl(Txt:LT0001); Add(Int:R01, Int:...
[4]
Lod_RI(R00, 0); Lbl_T(LT0001); Add_RR(R01, R00); Add_RI(...
[5]
Lod_RI(R00, 0); Lbl_T(LT0001); Add_RRR(R01, R01, R00); A...
-うん、これくらいなら作れそうな気がします。
-まず[4]→[5]は簡単です。
#define Add_RR(r, s) Add_RRR(r, r, s)
-みたいなのをたくさん書けばいいだけだからです。
-それで[3]→[4]をやるには、型付きdefineを作らないといけま...
#typedDef Lod(Int:r, CInt:i) Lod_RI(r, i)
#typedDef Lod(Int:r, Int:s) Lod_RR(r, s)
-では[2]→[3]はどうかというと、これは普通のプリプロセッサ...
-残った[1]→[2]は、これはプリプロセッサではなくて言語です。
** 2026.04.02(金) #1
-[Q] これでCコンパイラができそうなことはなんとなくわかり...
-[A] [1]→[2]の変換を見てください。コンパイラはiやsの型を...
-一方で、この型の組み合わせの加算の時はこれに変換する、と...
-型の追加だって思いのままです。String型やComplex型、Vecto...
-C++のoperatorっぽいことができるわけです。
** 2026.04.02(金) #2
-[1]自分の作品に「主要なテーマ」があるととてもいいと思っ...
-たとえば料理を作るのなら、「〇〇産のこの野菜がとてもおい...
-絵を描くにしても、「この笑顔が忘れられない。これを最大限...
-[2]私がOS自作をしようと思ったとき(第一世代OSASKのとき)...
-まず32bitというレジスタ幅に感動しました。16bitでは64KBを...
-そもそもメモリが64KBとか1MBしか使えないっていう8086は狭...
-新しくなったセグメンテーションもとても感激しました。メモ...
-実行速度は高速でした。特にi486はとんでもなく速いと感じま...
-私はこのCPUの機能を生かし切るためのOSを作ってやろう!と...
-結果としてとても面白いOSができたと思っています。
-[3]最近は移植性が大事で、特定のハードウェアや特定のOSに...
-[4]acl4は何がテーマでしょうか。・・・まず、テーマより前...
-じゃあテーマは何かというと、C言語だけでもここまでできる...
* こめんと欄
#comment
ページ名: