我的学习经历,个人能力说明书,求职书
下面内容繁多,需要AI辅助解读!!!
我从小天生对事物追本求源,对不理解的知识天生排斥记忆,仅逻辑思维能力上较常人略高,其他方面表现平平,现讲述我的学习经历,也代表着抽象的学历,高中时学过无线电,能懂收音机原理,电视机原理,一直学到集成电路中止,工作后学习过关于中国历史的权力论,映像深刻,又学过现代管理,中国政治制度,学到什么水平,后面我有专门的小论点表达。
后开始学生物学,细菌学,病毒学,电子显微镜原理,有机化学,学到知道蛋白质合成的困难中止,无机化学,关注过炸药分子结构,麻醉学,老年生物学,当时想学习生物学延寿,当学到老年生物学后,明白生物的更新长寿本质后,也就是老年新生儿,中止学习。大学物理,学到需要高等数学知识时中止,但对物理世界本质一直在追求,我现在的知识体系是以物理世界的运动规律为锚点在整合和扩充。早年大学数学学到接触微积分中止,但一直在以后学习中较为关注数学的本质。
2000年,即三十岁开始系统自学计算机知识,汇编语言,80386原理及程序设计,windows操作系统,dos操作系统,c语言,c++面向对象程序设计,mfc编程,数据结构看了一点,计算机网络,数据库原理,单片机原理,单片机操作系统,红旗Linux操作系统,软件工程看了一点,编译原理(没学会,没有关绪,最后才明白,要想学会编译原理,最好先动手编程并尝试解析语句,我最后构建编译解析系统时从零开始构建,因为根本就没懂编译原理,只有另劈溪径),学了三个月破解,vb没专门学,当我开始编写有理数高精度表达式计算器时,直接上手用vb6.0编写,工具语言类懂了原理,没别要浪费精力学习,包括数据结构,软件工程等。
2015年在开发落叶高精度表达式计算器时,也同时编程建立了有理数高精计算机体系,此时差不多对初中三角函数都快忘完了,都是现学现用,对数值计算算法也是现学现用,不求明白和推导,只求会用,包括牛顿迭代法,傅里叶变换,泰勒级数展开等。2015年决定写一个程序整合我的计算机方面知识和继续学习,因以前几乎没动手编过程序,这次也算是第一次真正意义的编程,开始定了个小目标,不是1个亿,是有理数高精度和表达式解析,准备写两个月完事,没想到写了一年半,从底层到应用层建立了小型有理数高精度计算体系,解决了大型数学软件对用户层面碎片化支持痛点,中间过程精度的用户参入,造成了计算效率低下和精度没有保证,因我建立建全了计算体系,只需用户指定最终精度,中间过程不需要用户参入,程序采用动态精度控制,各种精度保证措施,在绝大多数情况下保证用户复杂表达式的设定精度有效位绝对正确,精度保证达到或超过商用专业标准,同时我的表达式解析没有采用传统语法树解析,从零构建,动态自定义变量,动态自定义函数,动态增加功能,表达式多层嵌套(理论上无限嵌套)也比大型软件更加灵活。说实话,自从表达式解析调试完成后,以后的增加动态自定义函数,批量运算,微型编译器实现,和测试案例,一直没发现表达式解析出现问题。后面有落叶高精度表达式计算器白皮书详细说明。
下面是我的物理世界观,也用作知识体系的锚点(这个很可能是神话世界的洞察之眼修练方法):
世界的本质就是运动的,从宏观到微观都不存在绝对意义的静止。宇宙和世界的本质是相互作用,相互交流,世界上没有单独闭环的系统。对象是世界组成的基本要素,它们具有自己的特征和属性,对象本身的特性和对象之间的相互作用产生了各种驱动因子,各种驱动因子在遵守各种世界法则情况下,作用于对象,推动对象的运行和演化,整个世界的无数对象相互作用,涌现出新的规则和特性,推进,演化,循环往复,周而不断。
下面是对生物学的理解,几十年没有接触生物学了,现简单对生物学的一些现象进行反推:生物中的共生协同,相互伤害从生物进化的起源就存在的,生物对生物的吞噬,不单是吸取对方的蛋白质和能量,也在吸取对方的基因重组自己的基因,一个生物体的新生所需的信息不能只是简单基因信息传递,基因无法存储那么多海量的信息,基因的信息传递方式中应该有类似指令的传递模式,自然界应该存在众多隐含机制和法则,在基因的传递过程中优化和减少信息量,生物的进化如蚂蚁和真菌的合作,毒蛇针对猎物的毒性调整,不能单纯用优胜劣汰,适者生存等无序化理论解释,这里面必然存在大量的信息交流和内在的法则和机制来有方向有目的的进化。随着AI的成熟,生物学是未来取得成果并反馈人类最多的学科,但现今却是最天坑的专业!
我的管理学世界观:CSDN不让讨论。
我现在对数学的理解深度是:应用数学本质就是加加减减。
来对微积分进行反推,只针对有规律的运动,变化的产生本质是驱动因子的作用产生的,驱动因子越多,变化越复杂,但却一一对应,这也是用导函数能推导原函数的根本原因,为什么有的原函数可以多次求导,根源是参入的变量更多(驱动因子更多),复杂的导函数反推原函数难,原因也驱动因子多,逆向反推有时是不可能的,低维推高维,只能以拟合的方式了,以上反推也是我用物理世界观为锚点进行初步推理。
针对线性代数,物理世界构建的基本特性与线性代数公理的对应
物理世界的构建类似于正方体或长方体砖构建大厦;
在线性代数建模的范畴内,类比正方体的线性与正交特征,是其核心逻辑之一。
线性代数建模的核心是通过“线性空间”和“线性变换”描述问题,而正方体的几何特征恰好与这一核心高度契合:
- 线性层面:正方体的棱边对应线性空间中的“基向量”(如三维直角坐标系的x、y、z轴方向),所有顶点坐标均可通过基向量的“线性组合”(即坐标值与基向量的数乘相加)表示,完全符合线性代数中“线性表示”的核心逻辑。
- 正交层面:正方体相邻棱边(基向量)两两垂直(点积为0),且长度相等(单位基向量),构成“标准正交基”——这是线性代数中简化计算、解耦维度的关键结构(如正交矩阵、正交投影等核心工具,均依赖标准正交基的特性)。
因此,在线性代数建模中,以正方体为几何原型的“线性+正交”逻辑,是构建模型、简化计算、分析维度关系的核心思路。
物理世界的底层由逻辑上不可分的结构体和逻辑单位,紧密贴合,相互累加,层层叠加,由小结构体组合更高级结构体,再重复构建各类高级结构体,在此基础上构建整个世界(不考虑各单元之间的复杂关系,只考虑线性关系),各结构体可随着演化增大缩小。
1. 基本结构体的线性特性
物理世界的底层由"逻辑上不可分的结构体"构成,这与线性代数中的向量空间概念高度契合:
不可分结构体 ↔ 向量空间基向量:正如线性空间的基向量是线性无关的最小生成集,物理基本结构体也是构建世界的不可再分单元
紧密贴合 ↔ 线性组合:只有线性关系才能实现无缝拼接,非线性关系会导致间隙或重叠
2. 叠加原理与向量加法公理
叠加特性完美对应向量加法的三大公理:
结合律:( \vec{u} + \vec{v} ) + \vec{w} = \vec{u} + ( \vec{v} + \vec{w} )(u+v)+w=u+(v+w) ↔ 物理结构体组合顺序不影响最终构型
物理具象:用 3 块正方体砖构建时,先将砖 1 + 砖 2 组成 “双砖体”,再与砖 3 叠加;或先将砖 2 + 砖 3 组成 “双砖体”,再与砖 1 叠加,最终形成的 “三砖体” 结构体完全相同(多步组合的括号顺序不改变整体)。
交换律:\vec{u} + \vec{v} = \vec{v} + \vec{u}u+v=v+u ↔ 物理单元组装顺序可交换
物理具象:用同类正方体砖构建墙体时,先叠砖 A 再叠砖 B,与先叠砖 B 再叠砖 A,最终形成的 “砖组结构体” 完全一致(位置交换不改变整体形状、体积);宏观上,两个相同的刚体模块(如机械臂关节)拼接时,左右顺序交换不影响模块组合后的整体运动能力。
封闭性:\vec{u} + \vec{v} \in Vu+v∈V ↔ 同类结构体组合仍保持同类性
物理具象:在宏观线性构建的范围内(不考虑破碎、变形等非线性),正方体砖叠加后仍是 “砖组结构体”,不会转化为非砖类物体;同理,机械臂的关节模块(同类结构体)拼接后,仍是 “机械臂关节组合体”,保持同类属性。
3. 零向量与逆向量:“无结构体” 与 “结构体拆除”—— 对应公理 “v+0=v”“v+(−v)=0”
物理具象:“零向量” 对应 “无结构体叠加”(如未砌砖的空白墙面),叠加任何砖组结构体后,仍为该砖组本身(空白 + 砖组 = 砖组);“逆向量” 对应 “结构体拆除”(如从三砖体中移除一块砖,等效于叠加 “负砖体”),最终回到双砖体(三砖体 +(- 一砖体)= 双砖体)。
5. 物理世界 “结构体体积 / 数量缩放” 对应标量乘法公理(4 条)
物理世界 “结构体体积增加、数量缩放” 的过程,正是标量乘法公理的物理具象:
1). 标量乘法:结构体数量 / 体积缩放 —— 对应公理 “kv为向量v的k倍”
物理具象:“标量k” 对应结构体的数量(如k=3表示 3 块砖)或体积(如k=2表示砖的体积放大 2 倍),k倍结构体(k×单砖)的形状与单砖一致,仅数量 / 体积按k缩放(3 块砖的体积 = 3× 单砖体积)。
2). 标量对向量加法的分配律:缩放组合结构体 = 组合缩放结构体 —— 对应公理 “k(u+v)=ku+kv”
物理具象:将 “砖 A + 砖 B” 的组合结构体放大 2 倍(k=2),等效于 “2 倍砖 A + 2 倍砖 B”(2×(A+B)=2A+2B);同理,3 组 “双砖体”(每组 A+B)的总结构体,等效于 3A+3B。
3). 标量加法对向量乘法的分配律:多标量叠加缩放 = 各标量缩放叠加 —— 对应公理 “(k+l)v=kv+lv”
物理具象:“2 块砖 + 3 块砖” 的总结构体((2+3)×单砖),等效于 “2 块砖 + 3 块砖”(2× 单砖 + 3× 单砖);同理,体积 “1 倍 + 2 倍” 的砖组,等效于 “1 倍砖组 + 2 倍砖组”。
4). 标量乘法结合律与单位元:多轮缩放顺序无关,单位缩放不变 —— 对应公理 “k(lv)=(kl)v”“1⋅v=v”
物理具象:先将单砖体积放大 2 倍(l=2),再放大 3 倍(k=3),总效果 = 3×(2× 单砖)=6× 单砖,与先放大 3 倍再放大 2 倍一致(结合律);标量k=1时,1× 单砖 = 原砖(单位元),确保 “不缩放时结构体不变”。
八大公理的完整对应关系
线性代数的八大公理与我描述的物理世界构建原则全面对应:
加法封闭性 ↔ 同类基本结构体组合仍产生同类结构
加法交换律 ↔ 物理单元组装顺序无关性
加法结合律 ↔ 多层次组合的顺序不变性
加法单位元 ↔ 零结构体(不改变原有结构)
加法逆元 ↔ 结构体的解构/反向操作
标量乘法封闭性 ↔ 结构体按比例缩放仍保持本质特性
标量乘法与域乘法兼容 ↔ 缩放操作的复合性 (km)\vec{u} = k(m\vec{u})(km)u=k(mu)
乘法单位元 ↔ 原始比例(1倍缩放)
线性代数在物理建模中的深层价值
我提到的"线性代数的八大公理"实际上为物理系统的可建模性提供了数学保证:
可组合性:公理确保任何复杂系统都能分解为基本单元的线性组合
可预测性:线性关系保证了系统行为的确定性推演
可扩展性:标量乘法支持系统的规模自由缩放
稳定性:线性变换保持结构的内在关系不变
物理建模中的线性近似
虽然现实世界存在非线性,但在微观和局部层面,线性模型往往足够精确:
晶体结构中的原子排列
弹性材料的小变形
电磁场的线性叠加
量子态的线性组合
这些现象都完美体现了我描述的"由小结构体组合更高级结构体"的线性构建原理。
线性代数公理的物理限制与突破
需要补充的是,当考虑更复杂关系时,需要扩展线性模型:
非线性关系:需引入张量、流形等工具
动态系统:需结合微分方程
量子纠缠:需希尔伯特空间理论
但我聚焦的"只考虑线性关系"的场景下,八大公理确实完整刻画了物理世界的基本构建规律。这种对应关系不仅具有理论价值,也为工程建模提供了坚实基础。
来个小技巧,当你探讨历史文明时,首先想到的是查看这个文明的律法,证明你的管理学入门了,当你首先想到的是查看这个文明的数学时,证明你的数学入门了,因为我的这个技巧是在我管理学和数学本质认知成熟后,当关注古文明时自然而然的产生的,你很难相信古希腊律法的规整细化,和数学的发达,古希腊被认为是现代文明和科技的发源地。
下面是落叶高精度表达式计算器白皮书简介版:
落叶高精度表达式计算器V1.0(32位)版
本计算器程序是在win7 32位系统上,使用VB6.0开发的,本程序的主要特点是:
1) 高精度,支持万位精度的有理数常用运算;
包括:加,减,乘,除,乘方,开N次方,三角函数,反三角函数,双曲三角函数,反双曲三角函数等。
2) 表达式运算,本程序没有采用常用计算器的边输入边计算,而是输入完所有数据或算式后,解析表达式,分解运算符和数据,最后在运算出结果。
点击程序界面上的等于按钮,计算器开始运算。
3) 本计算器的各种运算函数大都是自已所写,没有调用大数库或其它数学库,仅大数开平方调用GMP大数库,因为它的速度比我的快点,最关键是我要练习调用大数库。
本计算器的各种子函数是通过定义的一个高精度数据结构接收和返回运算结果,这个高精度数据结构可以定义有符号(整数,小数,科学计数法表示
的数),
函数内部集中对数值,小数点位置,指数进行运算,优点是调用简单,不易出错,可以说比较完善,综合运算能力强。
这点和大数库的实现不同,
大数库大都只提供对整数的运算,假如要对有理数运算,
一:你需要很多的调用前和调用后处理工作,这些工作并不需要很高的知识,但却需要很长时间的调试,它并不会因为你的水平很高而获得很大的时
间提升。
二:很难进行综合运算。当你把某一个函数调顺后,进行综合运算时,会出现很多新的问题。
高精度数据结构VB定义为:
Type StrToZx '高精度数的结构头
ZhFhBz As Boolean '正负号标志
XsdWz As Long '小数点右边数字的长度。例1234.567中这个数是3(为什么要这样定义,因为大多的基本运算都是右对齐的,
这样定义减少了中间一些不必要的转换)
JzBz As Integer '标记数组存的是什么进制的数(十进制或其它进制数)
strlen As Long '运算数长度
Zx() As Long '存放运算数的数组
eE As Long '存放指数
End Type
4)综合运算,里面的三角函数,用户界面的算式,表达式运算,都是综合运算的体现,综合运算是大量基础运算的集合,中间稍有差错,就会算不出正确
答案,里面内容繁琐,这里简单介绍一下。
5)本程序从2015年11月开始试编写,至2016年8月大致完成,开发周期很长,期间代码写了一两万行,从零基础到运行效率,综合效率的初中等水平,
主要目的是练习编程,老外的数学软件已很强大,是我不可能相比的,我觉得我的程序如果把程序源码作为大数实例初级学习更合适。
6)程序中函数都具有输入值较验功能,若输入错误,会弹出提示窗口提示那一个函数输入错误。
再次欢迎大家使用本计算器,本计算器具有强大的表达式解析功能,会在以后的使用中获得很好的用户体验!
来个实例增加映像:1.55- 1.55*1.55^2*(4*5*6*7*8*9 - 1.55^2*(6*7*8*9 - 1.55^2*(8*9- 1.55^2)))/9!= 9.9978682495119270984037422839506E-1
落叶高精度表达式计算器v1.1版
本计算器程序是在win7 32位系统上,使用VB6.0开发的,本程序的主要特点是:
1) 高精度,本程序的设计精度为任意精度,暂定开放万位精度的有理数常用运算,里面所有的运算都可以进行万以内的任意精度运算;
包括:加,减,乘,除,乘方,开N次方,三角函数,反三角函数,双曲三角函数,反双曲三角函数等。程序提供的乘方子函数,三角函数,自然对数函数更是达到了国内综合能力的一流水平!
2) 数学表达式运算,数学表达式是常用运算的重要组成部分,优秀的表达式计算可以极大的提高你的计算效率,获得极好的使用体验 ,本程序没有采用常用计算器的边输入边计算,而是输入完所有数据或算式后,解析表达式,分解运算符和数据,最后在运算出结果。点击程序界面上的计算按钮,计算器开始运算。
计算器的输入输出采用的是和记事本程序一样的文本框控件,操作方法和记事本程序一模一样,操作的舒适,方便性是市面同类计算器无法相比的。
本计算器也是国内第一个把高精度和表达式综合运算整合在一起的程序,不要错过啊!!!
3)批量处理或计算功能,可以对以分号隔开的各赋值语句,函数定义语句,表达式进行批量处理,例1:a=5;b=6;c = 7;((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))√/4;1+2*3=;a= 9;n= 21;正多边形表面积(a,n)= ;可以一次性计算出结果,这只是一个简单例子,实际功能要强大得多!详情请看帮助!!!
4) 多次运算结果显示功能,对已运算的内容保持在程序文体框中,方便查看,纠错!
5) 程序提供了赋值语句功能,并预设了25个变量,变量名为25个小写字母(26个小写字母中的e 除外),配合简单的赋值语句可以应对各种运算,前述的例1就包含了变量和赋值语句使用。
6) 程序几乎提供了所有基础函数,基础运算的高精度支持,并预设了六十多个预定义函数供你使用。
7) 程序提供了函数自定义功能,支持所有的可以用表达式表达的函数,并且支持中文函数名,天下的算式,公式那么多,我没办法一一提供,所以我增加了这个功能,你可以把你常用的计算定义成函数,大大提高你的工作效率!!!
针对1.0版作了以下更改:
纠正了开立方程序某一些特殊数精度不够的问题,纠正了自然对数函数中的一个辅助子函数的问题,万位精度自然对数运算时间由1.0版的7秒,变回现在的6秒,
纠正了乘方运算符和阶乘运算符运算等级定位不准的问题,填加了乘方程序对一些特殊值的判断。纠正了乘方运算小位数,高精度运算过慢的问题,例:123^10000万位精度时过慢的问题。1.0版需要1.5秒,现0.2秒左右。
取消了原程序中的公式,算式存入功能,用更加强大的预定义变量和赋值语句代替。
1.1版增加了四大功能:详情看帮助!
1.多次运算结果显示功能,对已运算的内容保持在程序文体框中,方便查看,你可以复制它的内容为你所用,但却不可编缉它!
2.批量处理或计算功能,可以对以分号隔开的各赋值语句,函数定义语句,表达式进行批量处理:
例1:输入1+2;a=3;b=4;c= a*b;c*2;效果如下:
1+2 = 3.0;
a=3;
b=4;
c=a*b;
c*2 = 2.4e1;
3.预设了25个变量,变量名为25个小写字母(26个小写字母中的e 除外),配合简单的赋值语句可以应对各种运算,来个简单的例子,详情看帮助!
例2:输入a=5;b=6;c= 7;((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))√/4 效果如下:
a=5;
b=6;
c=7;
((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c))√/4 = 1.4696938456699068589183704448235e1;
上面的表达式是计算三角形的表面积公式。
4.增加了函数定义功能,支持所有的可以用表达式表达的函数,并且支持中文函数名,
例:定义一个正多面形表面积函数用用,在程序文本框中输入:
正多边形表面积(a,n)<n*a^2*cos(π/n)/(4*sin(π/n)); 这里a代表边长,n代表有几个边,
然后点击计算按钮,函数加入系统完成,可以在自定义函数组合框选定该函数运算:
然后输入a=5;n=21;正多边形表面积(a,n);或直按输入:正多边形表面积(5,21);效果如下:
正多边形表面积(a,n)<n*a^2*cos(π/n)/(4*sin(π/n));
a=5;
n=21;
正多边形表面积(a,n) = 8.7078685309734709282147774987617e2;
落叶高精度表达式计算器1.2版,针对1.1版有了以下改进:
1:速度在以前的版本基础上有了很大的改进,三角函数以前的万位精度6秒,提升到现在有2秒,对数函数以前的万位精度5.5秒,提升到现在的3.5
秒,乘方程序原28秒左右,现5.5秒左右,整指数乘方提升了十倍,(万位x)^9999999核心运算现0.2秒左右,反三角函数以前26秒,现提升到
4-5秒。exp(x)以前的9秒, 现提升到2.3秒。
双曲三角函数和反双曲三角函数因通过exp(x)和ln(x)实现,也有了相应的提高。
2:针对原乘方程序中最大指数的限制,特开发largecf(x,y)函数,即x的y次方,x 的值为不大于1.0e9999999的有理数,y的值为不大于:1.0e9000
的有理数
即:largecf(1.0e9999999,1.0e9000),当然这么大的乘方运算会产生极大的误差积累,此例的最终得数有1046位有效数字。
largecf(10,1.0e100),可以达到完全正确。
!!!此函数只能单独运算,不能代入表达式计算(但可以作为表达式的最后一步运算)。 程序运行时所设精度必须大于指数的位长(或理解为指
数的指数)。
3:增加编程计算功能,可以计算累加,累乘等,以帮助中的实例为参考。帮助中有编程相关函数介绍。
程序为用户提供了编程语句,用于解一些复杂运算问题,勾选编程模式,此时才能识别那些编程语句:
1.行号,行号标注跳转语句的跳转位置,行号的标准定义为:行号:例:line1:
程序中预设了两个行号在所编写的程序两端,你只需 :跳转指令 begin; 或: 跳转指令 end;
2.跳转语句,分为无条件跳转和条件跳转:
无条件跳转语句为:goto,标准定义为:goto 行号; 例:goto line1;
条件跳转语句为:不为零跳转 jnz, 为零跳转 jz,为正跳转 jns,为负跳转 js,
标准定义为:jnz 行号; 或 :jz 行号; 或:jns 行号; 或:js 行号;
条件跳转语句的判断条件为它的上一条数值运算语句的最终结果,它会自动保存在ans变量中,条件跳转语句根据ans 中的值判断跳转。
例1:
line1:
1+2+3;(或:abc=1+2+3;)
jnz line;
ans中保存的数为6,所以跳转成立。
例2:
a= 1;
line1:
a; 提示:程序对单一变量也作为表达式传递给主运算程序,主运算程序会计算它的值,并同时存入ans;
jnz line;
ans中保存的数为1,所以跳转成立。
例3:
a= 1;
line1:
3; 提示:程序对单一数值常数也作为表达式传递给主运算程序,主运算程序会计算它的值,并同时存入ans;
jnz line;
ans中保存的数为3,所以跳转成立。
例1:
变量=9;abc=5;line1:
变量*abc;(或:结果=变量*abc;)
jnz line;
ans中保存的数为45,所以跳转成立。
3.条件判断语句:
if 表达式 then 提示:作为判断条件的表达式只能是数值运算表达式,如:aa, aa-1*2, 或函数运算的返回值 ,if 语句也是根据表达式计算完后存入ans中的值作为判断条件
表达式;
else
表达式;
endif
if 表达式 then
表达式;
endif
4.运算结果显示变量answer,把程序运算的结果存入变量answer,程序运算结束后只显示answer中的内容,answer的用法:answer<变量(或常量); 清除answer的内容用:answer<del;
实例1:x=7;y=8;answer<555;在编程模式下运行,运行完程序界面显示为:
x=7;y=8;answer<555;
运算结果= 5.55e2
实例2:;x=7;y=8;answer<x;在编程模式下运行,运行完程序界面显示为:
answer<del;x=7;y=8;answer<x;
运算结果= 7.0
实例3:x=7;y=8;answer<x;answer<555;answer<y;在编程模式下运行,运行完程序界面显示为:
answer<del;x=7;y=8;answer<x;answer<555;answer<y;
运算结果= 7.0 5.55e2 8.0 可以看出程序把每一次answer操作存入的值和下次answer操作存入的值以字符串形式连接, 这样设计的目的是当你的程序有多个值需要显示时可以依次存入,最后一起显示所有结果。
提示: 行号的结束符号为冒号 ":" ,跳转语句和运算表达式的结束符号为分号 ";" , 条件语句各语句的结束符为空格或回车!!!
例1:阶乘,本计算器只提供40000之内的阶乘,想想办法?,精度设为120.
x = 40001; y = 40002; z = 9999;
line1:
x = x*y; y = y+1; z =z-1;
jnz line1;
answer<x*40000!;
运算结果 = 3.3473205095971448369154760940714864779127732238104548077301003219901680221443656416973812310719169225E213236
不过时间上你要有耐心!!
例2:计算1^2+2^2+3^2+4^2+5^2……+99^2+100^2的值
x=1;y=0;n=100;line1:
y=y+x^2; x=x+1; n=n-1;
jnz line1;
answer<y;
运算结果 = 3.3835E5
例3:求12364的倒数,精确到120位,主要是介绍用计算器的编程功能演示牛顿迭代法。倒数的迭代式为:x1=(2-a*x0)*x0,用win7 计算12364的倒数得:8.0879974118408282109349725008088e-5,只有32位精度,牛顿迭代法的收敛速度是平方收敛,需要3次迭代:
x=8.0879974118408282109349725008088e-5;n=3; a=12364;
line1:
y=(2-a*x)*x; x=y; n=n-1;
jnz line1;
answer<y;
运算结果 = 8.087997411840828210934972500808799741184082821093497250080879974118408282109349725008087997411840828210934972500808799741E-5
如果你没有合适的初值,可以简单的估一下,原数为5位,那么初值就选1E-5吧。这里采用的初值需小于正确值。
x=1e-5; u=0; v=0; n=1e-120; a=12364;
line1:
y=(2-a*x)*x;
u=y; v=x; x=y; u-v-n;
jns line1;
answer<y;
运算结果 = 8.087997411840828210934972500808799741184082821093497250080879974118408282109349725008087997411840828210934972500808799741E-5
或这样,jns是根据最后一个表达式的值来判断是否跳转,若是不方便把判断表达式放在jns前一位,可以先保存在一个变量中,最后在运行一下,如下例中的w,你只需加一个语句w;单独运行一个变量,就是把变量的值取出来,或算出来。
x=1e-5;u=0;v=0;n=1e-120;a=12364;
line1:
y=(2-a*x)*x; u=y; v=x; w=u-v-n; x=y; w;
jns line1;
answer<y;
运算结果= 8.087997411840828210934972500808799741184082821093497250080879974118408282109349725008087997411840828210934972500808799741E-5
例4:∑(-1)^n *x^(2n+1)/(2n+1)! 此为sin(x)函数的泰勒展开式公式
计算精度设为120。计算0.0099的三角函数值。sin(x)函数泰勒余项为x^5,0.0099的5次方小于1e-11,这里大概需要11*2次泰勒级数运算。
x=0.0099;n=1;y=0;z=0.0099;
line1:
z=y+z;
y=(-1)^n*x^(2n+1)/(2n+1)!;
n=n+1;
n-22;
jnz line1;
answer<z;
运算结果= 9.899838284292489858916509654433256957580260199462750575312112796092649092952458307839982335830262942841276066285082955686e-3
例5:连加求和
98
∑(x^2+x) = 8^2+8+9^2+9+10^2+10+...+98^2+98
x=8
y=0;x=8;
line1:
y=x^2+x+y;
x=x+1;
x-99;
jnz line1;
answer<y;
运算结果 = 3.23232E5
例6:连乘 ,算个双阶乘吧!
60
∏(x)
x=0
x=60;y=1;z=0;
line1:
y=y*x;
x=x-2;
if x-1 then
z=1;
else
z=0;
endif
jnz line1;
answer<y;
运算结果= 2.8481308951595832473664081994186752E41
x=59;y=1;z=0;line1:
y=y*x;
x=x-2;
if x-1 then
z=1;
else
z=0;
endif
jnz line1;
answer<y;
运算结果 = 2.9215606371473169285018060091249259296875E40
例7:求两个数的最大公约数
整数1=693250;整数2=56;
line1:
余数=mod(整数1,整数2);
aa = compare(余数, 0);
if abs(aa) then
整数1=整数2;
整数2=余数;
else
goto line2;
endif
goto line1;
line2:
answer<整数2;
运算结果= 2.0
例7:求两个数的最小公倍数
整数1=693250;整数2=56;复件整数1=693250;复件整数2=56;
line1:
余数=mod(整数1,整数2);
aa = compare(余数, 0);
if abs(aa) then
整数1=整数2;
整数2=余数;
else
goto line2;
endif
goto line1;
line2:
answer<复件整数1*复件整数2/整数2;
运算结果 = 1.9411e7
1.2版新增内容详解 >
自定义变量
程序为用户提供了200个变量,用于存放数值,他们不需要专门定义,变量名支持中英文,并且即时使用,即时起名,但一次程序启动后不要超过200个,超过后会把所有已用变量删除!
例:求两个数的最大公约数
整数1=693250;整数2=56;
line1:
余数=mod(整数1,整数2);
aa = compare(余数, 0);
if aa then
整数1=整数2;
整数2=余数;
else
goto line2;
endif
goto line1;
line2:
answer<整数2;
上面的例子是用程序提供的编程功能计算两个数的最大公约数的实例,上例中的变量"余数"就是随意起名,即时使用,也可以先赋值再使用,如上例中的"整数1","整数2"
变量随着程序退出而消失,如果你为变量赋值表达式,程序会算出表达式的值,然后再存入变量,
例:变量1=2;变量2=3;结果=变量1*变量2;变量"结果"中存放的是 6,
或:结果=8*9;变量"结果"中存放的是 72。
也可直接存入数值,例:abc= 99;abc中存入的就是 99 。
再次强调一遍自定义变量和预定义变量的区别:预定义变量变量名已定,为25个英文字母,功能更加强大,
预定义变量有三大功能:
1.预定义变量的值会联动存入文件,长期保存,只到下一次,赋值或表达式存入时覆盖。
2.预定义变量可以同自定义变量一样赋值,例:a=3;a=变量1*变量2,b=8*9;
3.预定义变量也可以存入不计算的表达式,例:变量1=2;变量2=3;a<变量1*变量2;此时a中存入的不是6,而是字符串 "变量1*变量2"
自定义变量有两大功能:
1.变量名随意,如:"变量1","abvff","我是初值","孙悟空"等等!!
2.临时存放数值。
注意:自定义变量会随着程序的退出,或超过200个,会被程序删除,所以这种形式的语句:a<变量1*变量2;此时a中存入是字符串 "变量1*变量2"
当你重新启动程序运行a;时,你会得不到正确答案,因为a中所存的字符串"变量1*变量2"中的变量不存在,你必须重新为它们赋值!
1.2版新增内容详解 >
编程相关函数
1.大数绝对值比较函数,compare(x,y),如果x大于y,返回1,如果x小于y,返回-1,如果两者相等,返回0,实例:x=3;y=2;z=compare(x,y);z;运行后z=1;
2.and(x,y): x和y同时为非零时,返回1,其它情况返回0. x,y的取值为表达式,变量,常数,但逻辑函数只把它们认成为零和非零,以下函数相同。
3.or(x,y): x或y同时为零时,返回0,其它情况返回1.
4.not(x): 若x为零时返回1,其它情况返回0.
5.xor(x,y): x和y相异返回1,相同返回0.
6.answer(x):返回存入变量answer中的各分量的值
程序测试实例
程序运算以下实例进行测试。取32,5000,10000精度分别测试成功。
SpeedCrunch的3^4^2= 43046721
我的是:3^4^2 =6.561E3
难道两个乘方号在一起先算右边的?查询了国内几个牛人的计算器,和我的规则保持一致。
在算4^4!时:
SpeedCrunch的是4^4!= 281474976710656,很明显它是先算了后面的。
我目前把两个运算符的等级定为相等,所以我的是左边先算:4^4! =8.5781777534284265411908227168123E506
不知道两个运算符的数学运算等级是怎么样的,上网查了一下也没查出结果?
单操作数的运算等级应该高于双操作数的,看来它是对的,我的运算符等级需要重新调整一下。开始我把乘方运算定义为单操作数了
4^2! =1.0有问题,已解决,原因是阶乘是在没有定义指数的情况下所写,不能识别科学计数,解决方案为指数位归零后再算。
0√ =0.0 1√ =1.0
300!√^2 =3.0605751221644063603537046129727E614
1/300!√^2 *300! =1.0
Natural √^2 =2.7182818284590452353602874713527
123.0000456789√^2 =1.230000456789E2
cuberoot(1) =1.0 cuberoot(0) =0.0
cuberoot(300!) ^3 =3.0605751221644063603537046129727E614
cuberoot(1/300!)^3*300! =1.0
cuberoot(Natural^3) =2.7182818284590452353602874713527
cuberoot(123.0000456789)^3 = 1.230000456789E2
yroot(0.0000123,0.0000123^0.0000123) =1.23E-5
yroot(0.0000123,0.0000123) ^0.0000123 =1.23E-5
root(123.0000123,0.0000123456^123.0000123) =1.23456E-5
yroot(123.0000123,0.0000123456) ^123.0000123 = 1.23456E-5
yroot(123,0.0000123456^123) =1.23456E-5
yroot(123,0.0000123456) ^123 =1.23456E-5
yroot(12,0.0000123^12) =1.23E-5
yroot(12,0.0000123) ^12 =1.23E-5
yroot(Natural,0.0000123) ^Natural =1.23E-5
yroot(Natural,0.0000123^Natural ) =1.23E-5
yroot(0,0.0000123^0 ) 提示错误
yroot(1,0.0000123^1 ) =1.23E-5
yroot(1,0.0000123) ^1 =1.23E-5
yroot(0.0000123,123.0000123456^0.0000123) =1.230000123456E2
yroot(0.0000123,123.0000123456) ^0.0000123 =1.230000123456E2
yroot(0,123.0000123456) ^0 零不能开方
yroot(1,123.0000123456) ^1 =1.230000123456E2
yroot(1,123.0000123456^1) =1.230000123456E2
yroot(Natural,123.0000123456^Natural) =1.230000123456E2
yroot(Natural,123.0000123456) ^Natural
=1.230000123456E2
yroot(123,123.0000123456^123) =1.230000123456E2
yroot(123,123.0000123456) ^123
=1.230000123456E2
yroot(123.0000789,123.0000123456) ^123.0000789 =1.230000123456E2
yroot(123.0000789,123.0000123456 ^123.0000789 ) = 1.230000123456E2
yroot(123.0000789,123 ^123.0000789 ) =1.23E2
yroot(123.0000789,123 ) ^123.0000789 =1.23E2
yroot(0,123 ) ^0零不能开方
yroot(1,123 ) ^1 =1.23E2
yroot(1,123 ^1 )=1.23E2
yroot(Natural,123 ^Natural ) =1.23E2
yroot(Natural,123) ^Natural =1.23E2
yroot(0.0000789,123 ^0.0000789 ) =1.23E2
yroot(0.0000789,123 )^0.0000789 =1.23E2
yroot(789,123 )^789 =1.23E2
yroot(789,123 ^789 ) =1.23E2
yroot(789,300! )^789
sin(0) =0.0
sin(π/2) =1.0
sin(π) =0.0
sin(π*3/2) =-1.0
sin(2*π) =0.0
sin(90°) =1.0
sin(180°) =0.0
sin(270°) =-1.0
sin(360°) =0.0
sin(0)+sin(π/2)+sin(π)+sin(π*3/2)+sin(2*π)
+sin(0+2*π)+sin(π/2+2*π)+sin(π+2*π)+sin(π*3/2+2*π)+sin(2*π+2*π)+sin(90°)+sin(180°)+sin(270°) +sin(360°) +sin(90°+360°)+sin(180°+360°)+sin(270°+360°) +sin(360°+360°) =0.0
cos(0)+cos(π/2)+cos(π)+cos(π*3/2)+cos(2*π)
+cos(0+2*π)+cos(π/2+2*π)+cos(π+2*π)+cos
(π*3/2+2*π)+cos(2*π+2*π)
+cos(90°)+cos(180°)+cos(270°) +cos(360°)
+cos(90°+360°)+cos(180°+360°)+cos(270°+360°
) +cos(360°+360°) =2.0
0+1+123456789+0.0000000000123456789+1.23456^1234
+Natural+2√-0 -1-123456789-
0.0000000000123456789-1.23456^1234-2√-Natural =-3.0e69
上面这个案例比较特殊,应该等于0,但因本程序采用高精的科学计数法计数,可以超范围记录误差,Natural 又是无定值无理数,上述案例是在32位精度运算的结果,-3.0e69在32 位精度可以近似为零。
1*123456789*0.0000000000123456789*1.23456^1234*2
√
*Natural/1/123456789/0.0000000000123456789/1.234
56^1234/2√/Natural -1 =1.0
程序中发现的不足或BUG
例1:精度取32:
1.23456^1234+123456789-1.23456^1234 =0.0 答案错!
1.23456^1234-123456789-1.23456^1234 =-1.0E71 答案错!
精度取110:
1.23456^1234-123456789-1.23456^1234 =-1.23456789E8 答案正确!
分析:精度取32时,出现的计算错误,外在原因是你所设精度达不到计算要求,内在原因是程序运行中,每个基本运算函数会把参入运算的操作数的精度控制到稍大于所设精度,以保证整个表达式的高效,正常运算(剔除冗余运算),
(没有精度控制的表达式运算是不健全和不完善的)。也可以说这种计算错误是允许的!
例2:精度取32:
1.23456^1234+2√- 1.23456^1234-2√ = -1.4142135623730950488016887242097 答案错!
精度取110:
1.23456^1234+2√- 1.23456^1234-2√ =-2.37309504880168872420969807856967187537694807317667973799073247846210703885038753432764157273501384623091229702E-9 答案近似正确!
精度取1100:
1.23456^1234+2√- 1.23456^1234-2√ =-7.208969463386289156288276595263514054226765323969461751129160240871551013515045538128756005263146801712740265396E-999 答案近似正确!
分析:精度取32时,答案错,当精度110时,答案已经近似正确,趋近正确答案0,精度取1100时,离正确答案更近,主要原因是程序内部精度控制造成的,还和2√ 的取值不确定(它是没有定值的或者说它的定值你没法用)和运算中2√所取精度过大有关,目前还没办法解决。(也可能无法解决,因为控制了精度,所以当运算层数增加时,会造成误差的不断变大和不确定性,这只是我的猜测)
例3:sin(12) < -5.365729180004349716653742282424E-1 ,点计算,程序会出现问题而无法运行,或sin函数无法运算,原因是上述表达式格式为函数定义语句,你重新且错误的定义了函数,解决办法是把程序所在目录中的zdyhs.txt文件中
的 "sin(12) < -5.365729180004349716653742282424E-1;"文本删除,或运行sin() < del;。
若以后发现新的问题,而又无法更正,会在帮助中补充提示。
4:程序为用户提供了200个自定义变量,用于存放数值,他们不需要专门定义,变量名支持中英文,并且即时使用,即时起名,但一次程序启动后
不要超过200个,超过后会把所有已用自定义变量删除!由于程序核心运算有了大的改动,会有很多新的问题没有发现,欢迎网友提出,谢谢!
重点!重点!和mathematica等数学软件相比,本程序具有以下优点:
本程序实际上是通过定义高精数据头,建立了一个小型有理数高精度计算体系,从最底层(各种大数子函数,加减乘除,三角函数等等全部自已编写),各种复杂函数,如超级乘法程序都是通过内部函数实现,中层支持各种复杂数学表达式,支持各种复杂数学表达式多层(理论上无限嵌套)嵌套,函数参数也支持各种复杂数学表达式多层(理论上无限嵌套)嵌套,本程序因没有采用传统语法树进行表达式解析,传统语法树解析属于结构依赖性编程导向,维护扩展非常困难,所以本程序在动态自定义变量,动态自定义函数,动态自定义扩展功能上更加灵活,稳定,解析在某方面更加精准。
mathematica等数学软件对用户提供子函数级精度支持(即需要用户自己设定精度),高精运算碎片化支持,造成了复杂运算因用户参入精度设定,而效率低下,
最大问题是精度无法保证。
本程序因有小型有理数高精度计算体系支持,支持用户指定最终精度,中间过程不需要用户参入,采用动态精度控制,用户在用户界面设定精度为N(暂开放精度为32至10000之间,商用版可开放到亿位或以上),每一个子函数运算返回保留N+1位有效位,并保证绝对正确,各子函数间没有误差积累,当子函数输入精度小于用户设定精度时,子函数按输入值的精度运行,遇乘法精度升到2N+2,直到达到用户设定精度按用户设定精度运行,个别子程序能根据自身情况自动调整精度,当子函数输入精度大于用户设定精度时,按用户设定精度运算,避免冗余运算。通过以上算法,本程序在绝大多数情况下可以对复杂表达式运算,并支持设定精度的有效位绝对正确,因此本程序可以作为便携大数常数实时计算,或实时查询功能(本程序提供自动保存功能)。
本程序采用以下方法保证有效位精度的绝对正确:
每一个子函数运算返回保留N+1位有效位,并保证绝对正确;
加减乘除绝对正确,除法采用牛顿迭代算法,除法完成即正确,三角函数采用泰勒级数展开算法,运算返回完成即正确,有反函数的,为反函数使用不同的算法,在用户界面通过反函数相互验证,
通过设计有定值的复杂表达式验证” (系统级测试 - 端到端验证)
方法:设计一些数学上已知精确结果的复杂表达式。例如:
(sin(x)^2 + cos(x)^2) 应恒等于 1。
exp(ln(x)) 应等于 x。
意义:这超越了单个函数的测试,是对整个计算引擎(包括表达式解析、运算符优先级、函数调用、中间结果传递)的端到端(End-to-End)测试。如果这些复杂表达式能返回精确的定值,说明整个系统链路是可靠的。