浮点精度问题的处理

计算时发现转换为JD值时,如2000年1月1日0点0时0分,JD值为2451545.4166707597,在还原时,变成了1999年12月31日23点59分59.999986588954926秒,这是因为浮点计算的问题导致。 通过人工修正加入一秒1/86400后,秒数变成了0.999981164932251111,换而言之,这里稳定的浮点数是0.99998这里,由于1000毫秒为1秒,而天象计算也不可能精确到这种程度,所以这里的计算可以进行简化。 故需进行浮点修正: var xxx = Math.Round(v - Math.Floor(v), 6); if (xxx < 0.50001) {         jd = v - xxx - 0.5 + 0.00001; } if (xxx > 0.50001)…

Read More

奇门遁甲寻冬至甲子正授

从奇门遁甲的置闰来说,起局有正授之说,然后一时一局,共计4320局。奇门遁甲的4320局实际上简化下来应该是1080局,1080局又可以简化为72局。72局对应于一年均分的七十二种状态即七十侯,这个是没有疑问的。 然而这里有一个非常关键的问题是,地球是绕太阳公转,这个时间是一个回归年,然而地球还有自转,平均角速度为4.167×10^-3度/秒,在地球赤道上的自转线速度为 465米/秒。地球自转一周耗时23小时56分,约每隔10年自转周期会增加或者减少千分之三至千分之四秒。 现代天文用春分点作为计算标准点,这个春分点是太阳黄道上的位置,然而地球每次转到黄道上同一点的时候,地球自转并非刚好同步,所以春分交节时刻,每一年不会在固定的时刻。 从古法上可以看,奇门首先重日,冬至所在日,为一阳始生的时候,假如恰好是完美正授的时候,即冬至甲子日,无论时刻在甲子日的什么时候,都是自该日子时开始起阳遁一局。 反推可知,奇门完美的正授局开始,应该是在冬至甲子日甲子时的时候,只要找到了这个时间点,那么就可以找到一个奇门相对原始的上元起局时刻,这个时间是1899年12月22日0时56分,此时起交冬至节,为甲子日甲子时。 显然可以注意到的是,0时56分这个子时都快过了,怎么可以作为依据呢?所以我们再找上一个,1693年12月21日0时43分22,比之前的时间要提前了一些,但这个显然是不够的,所以我们要继续慢慢找啊找。 然后可以找对一个相对完美点的时间,1384年12月13日0时6分33,此时只离冬至子之半6分钟而已,再往前的话便有606年12月18日23时24分38了,离冬至子之半未免太远了点,但是如果以23点为子时起点的话,那么这个时间相对更合适些。如果再考虑往前寻,就到了公元前344年12月25日0时20分39,偏差显然又大了起来,然后因为计算能力有限,往前推算更复杂一些,就不算下去了。 如果要作为奇门遁甲的上元积日,那么公元606年的12月18日的23时24分38秒,以及1384年12月13日0时6分33秒,这两个时间点均是比较合适的,如果以子之半来定局,从12分日来看,子时涵盖的就是23点至1点这个范围,那么以1384年12月13日0时6分33秒为中心,设子时夹它为中作为阳遁始生,道理上也是说得过去的。 另外就是一个更重要的问题,定寅时的问题,如果按天象而论寅时因为日出于寅才能完美在四柱中用日来代表人的主体,所以这个寅时的定制应该考虑到日出时间,寅时之所以被称为平旦,就是指它是日出的那个时间,那么这意味着,既然重新根据定气法太阳定了春分点,那么也应该考虑重定寅时,同样冬至点定为270度,那么子时也定为270度,以寅为0度,即日出瞬间为寅中,这样就重新制订了12个时辰,准验度会大大提高。 后世因为冬至甲子求取不便,而且置闰会比较麻烦,所以进行了改造,比如说第一年相差五天,第二年相差十天,以此类推, 如果要进行一甲子一闰,那么约要近九年才能开始一闰,这样的误差显然太大,所以不使用一个甲子为闰,而是采用了闰节,即以15天为一个周期,误差积累到10天时,闰一次,而来年的又相合,这样误差可以控制在五年以内。 然而实际上奇门最早的方式,是采用日闰的方法来进行的,这使得每三年中的第二年会进行一次置闰,于是这样构成了每三年一个的封闭周期。      

Read More

按定气法算天圣九年确有闰九月问题补充

农历的置闰上,区分有历理置闰而民用置闰两种: 历理置闰:如果月朔日和中气同一天,月朔日时间必须在中气时间之前,则该阴历月才包含那个中气。 民用置闰:如果月朔日和中气同一天,则该阴历月包含那个中气。   换而言之,在民用置闰上仅比较月朔和中气日期,而历理置闰比较月朔和中气日期、时、分、秒。   按上一篇,1031年11月17日04时09分为小雪节,而朔日在1031年11月17日20时52分。 如果按民用置闰,1031年11月17日便为初一,小雪节中气是算在第二个月的,所以这样就会出现闰九月。 如果按历理置闰,1031年11月17日虽为初一,但小雪节比朔的时刻更早,所以应算上一月,这样便没有闰九月出现。   而历理置闰法,虽然1645年开始使用,但是在民间仍然使用的是民用置闰,这个案例因为采用了定气法,并使用的民用置闰,所以按明末以后的历法来看,说天圣九年有闰九月是没有问题的。   所以这个案例并没有错。

Read More

天圣九年闰月再考兼判定

天圣九年辛未岁闰九月初间,李都尉家被贼从后花园人堂内偷去金银财物,辛巳日请元轸占之,卯将未时。        青勾合朱        丑寅卯辰    玄 青 勾 贵    官鬼 壬午 贵 空子          巳腾   酉 丑 寅 午    妻财 戊寅 勾 虎亥          午贵   丑 巳 午 辛    父母 甲戌 常…

Read More

1903年为什么是闰五月?谈农历中气与合朔同日的闰月情况

编写的代码中,发现日历上,1903闰五月,然而计算出来的却不是,结过一番仔细排查,发现原因所在。 1903年7月24日9点交大暑节,然而日月合朔却是在7月24号晚上20点,如果按严格的时间来说,此处大暑节属于上一节之中,故上一节中不应该进行置闰月。 然而按农历的历法规定并没有精确到时辰,而是认为7月24号有合朔,所以7月24号子时开始,就已经是初一了,这个类似于超接。 然后大暑节虽然提早到来,然而在历法中,归属在此月节中,所以此年是闰五月。 在编码中,则需要考虑到这个问题:如果本月的中气与下一月初一在同一天,那么本月要当作没有中气,进行置闰处理。

Read More

弦截法计算日月合朔

设时刻T还有T',并设T'=T,再设一个t 1、计算T时刻太阳黄经 2、计算T+t太阳黄经 3、计算T-t太阳黄经 4、计算T时刻月球黄经 5、计算T+t月球黄经 6、计算T-t月球典经 7、求T时刻太阳黄经与月球黄经之差 8、T+t的时刻的月亮黄经 减去 T-t时刻的月球黄经 加上 T- t时刻的太阳黄经 送去 T+t时刻的太阳黄经 ,再除以1e-6 9、第7步结果除以第8步结果,再用T减去这个结果,得到 T' 10、判断T'与T的差值绝对值,是否达到精度要求,如果未达到,则设T=T',然后从头开始再算。 如此T会不断更新为新的计算结果,然后不断精度越来越高,通常达到一分钟以下的精度即可,而且即使是一分钟的精度,也会与现实有所误差,所以这种计算也只是一个模拟值。  

Read More

SwissEphNet

为了尝试能够实现Windows上开发,Linux上运行,所以采用了Asp.net core,然而在使用SwissEphNet时,发现一个重大的问题,SwissEphNet读文件是调用一个事件,然后在这个事件用返回一个文件流,然后在这个文件流又返回给一个包装的CFile,然后CFile又返回给一另外的对象,更糟糕的是它层层迭代后,弄得一片混乱,有地方没有对流进行Dispose,因为没有释放资源就导致了在多线程访问时,会提示文件已经被其它进程占用。   因为其调用代码简直是满目疮痍,混乱一片,无法从内部进行修改,所以就采用了取巧的方法解决,每次创建一个CFILE对象时,就将它注册到一个字典里,并将当前的流记录下来,遇到再次访问相同文件时,就去反查该文件的流,并进行Dispose释放,然后重新创建CFile对象,如此暂时解决了问题。 推测应该是内存回收管理机制的问题,因为包装引用太多,虽然在代码中进行Dispose了,但仍然有地方可能有牵扯不清的引用,导致它不能指针变空,结果就导致了流无法翻译。

Read More

寿星万年历中的精度问题

寿星万年历的精度很准了,然而它的日月交朔时间,在计算2016年7月4号时,其交朔为北京时间19:00:56。通过计算发现,这里的精度值稍有此许问题,因为理论上1天有24*60分钟,计算出来约0.6744e-4代表一分钟,所以在采用的粒度选值也在这个范围,在寿星万年历中采用的是快速截弦法,计算速度极快,然而如果采用更精密的数据时,可以将粒度调整为更细,此时会发现实际上更精确的时间应该交朔时间应该是北京时间18:59:59.89秒,这与2016年的朔望弦交蚀时刻表是一致的。如果要追根究底的话,这个时间点非常重要,因为在19点以前仍然是酉时,19点以后已经是戌时,但同时考虑到天文的误差,虽然计算上认为可以精确到分钟,然而实际天象能够有如此精确,很难说得清的,所以寿星万年历还是非常精确的。

Read More

寿星万年历天圣九年闰月有误?

今日编写历法程序,在参照寿星万年历,查天圣九年,即1031年时,其上显示闰十月小。 而大六壬古案例却云:天圣九年闰九月初。 然而考宋史"天圣九年"中载:“冬十月丙戌,诏公卿大夫励名节。乙未,诏常参官已授外任,毋得奏举选人。辛丑,罢益、梓、广南路转运判官。闰月戊辰,翰林侍读学士孙奭请老,命知兖州,曲宴太清楼送之。” 故此年当闰十月,天圣年中,所闰九者惟天圣元年。      

Read More