| 文件 | 备注 |
|---|---|
| project.pdf | 题目 |
| report.pdf | 报告(上交) |
| CMakeLists.txt | CMakeLists |
| src/ | 源代码目录 |
| CMakeLists.txt | CMakeLists |
| constant.cpp, constant.h | 定义一些常数 |
| context.cpp, context.h | 变量储存 |
| error.h | 自定义异常 |
| eval.cpp, eval.h | 一些数学函数(例如 sqrt)和数学方法 |
| main.cpp | 主程序入口点,主要交互逻辑 |
| node.cpp, node.h | AST 节点 |
| number.cpp, number.h | 高精度数字 |
| parse.cpp, parse.h | 解析(tokens → AST) |
| token.cpp, token.h | tokenize(用户输入 → tokens) |
| test/ | 测试文件目录 |
| CMakeLists.txt | CMakeLists |
| test.hpp | 测试共用代码 |
| number_test.cpp, ... | 测试代码 |
对于一些内建函数和运行选项,可以用 calc --help 看帮助信息。
这里展示一部分运行效果(# 后的内容为注释,实际运行需要去掉)。
> 5 * (200 + 30 / 7.5) - 1017 % 13
1017
> 99999999999999.123456789 + 100.86
100000000000099.983456789
> 66666666.666666 * 10171017.1017
678067806779993.2193219322
> 0.5 % 0.2 # 推广取模
0.1
> x = y = 3
3
> y = y * 2
6
> x + 2 * y
15
> sqrt[2]
1.4142135623730950488
> ln[3]
1.0986122886681096914
> pow[2, 50]
1125899906842624
> pi
3.14159265358979323848
> e
2.71828182845904523536
我需要更高的精度!
$ ./calc --scale 100
> sqrt[2]
1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727
> pi
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068
>
> f[x] = 3 * x * x - 5 * x + 13
> f[1.3]
11.57
> g[x] = f[f[x]]
> g[1.5]
401.9375
还能玩点大的:(其中 if 函数为内置的函数)
> fib[n] = if[n < 3, 1, fib[n - 1] + fib[n - 2]]
> fib[12]
144
还能玩点更大♂的,求
> EPS = 1e-18
> abs[x] = if[ x < 0, 0 - x, x ]
> df[x] = (f[x + EPS] - f[x]) / EPS # 尽管 f[x] 还没定义
> solver[x1, x2] = if[ abs[x1 - x2] < EPS, x1, solver[x1 - f[x1] / df[x1], x1] ]
>
> f[x] = x * x * x - 7
> solver[1, 0]
1.9129311827723891012
>
> f[x] = 3 * x * x * x - 2 * x + 7
> solver[1, 0]
-1.49311568009346432092
>
> f[x] = (1 - phi[x]) - 0.05 # 概统作业,第 49 页第 53 题 (c)
> solver[1, 0]
1.64485362695147271485
> env
(function) f = (((((3 * x) * x) * x) - (2 * x)) + 7)
(function) abs = if[(x < 0), (0 - x), x]
(function) solver = if[(abs[(x1 - x2)] < EPS), x1, solver[(x1 - (f[x1] / df[x1])), x1]]
(variable) EPS = 0.000000000000000001
(function) df = ((f[(x + EPS)] - f[x]) / EPS)
(function) if = <built-in function>
(function) sin = <built-in function>
(function) sqrt = <built-in function>
...... # 省略了一些 built-in function
啊,我手抖了,程序会崩吗?显然是不会的
> f[x] = h[x] + 10086
> f[7]
Input #0:
f[x] = h[x] + 10086
~~~~
Error: no such variable or function: h
>
> g[x] = g[x + 1]
> g[7]
Input #2:
g[x] = g[x + 1]
~~~~~~~~
Error: Your recursion depth is exceeded 5000
If you are sure what to do, you can disable the check with "--no_depth_check"
>
我想摸鱼。
参考资料:倪泽堃《理性愉悦——高精度数值计算》,下载链接:https://github.com/YanWQ-monad/SUSTech_CS205_Projects/files/10820415/slide.pdf 。
为什么当时我就没有找到那么好的资料。