A.ANSYS浮点数
ANSYS数值型变量不区分整型(integer)或实型(real)数,均用双精度浮点数表示。当然也每没有所谓整型或实型变量符。
当采用未定义的变量赋予另外一个变量时,例如A=B,但B并未定义,则ANSYS内部不会赋予A零值,而是赋予A一个很小(tiny)的数值,如7.888609052E-031,并同时发出警告信息。
双精度浮点数与单精度浮点数的存储位数不同,这个不去介绍。但须知道双精度浮点数最多有15或16位十进制有效数字,因此别指望小数点15位后的赋值和运算是正确的,例如:
*creat,gc,mac
*cfopen,ls,txt
g1=1.000000000000000123 !123为15位之后
!内部不一定是1.000000000000000123
g2=5.000000000000000877 !877为15位之后
!内部不一定是5.000000000000000877
g3=g1 g2
!计算结果不一定是6.000000000000000
!可输出到文件查看
!采用42位小数有38位的F型输出
*vwrite,g1
('g1=',f42.38)
*vwrite,g2
('g2=',f42.38)
*vwrite,g3
('g3=',f42.38)
*cfclos
*end
gc
*stat
!打开文件ls.txt如下:
g1= 1.00000000000000000000000000000000000000
g2= 5.00000000000000088817841970012523233891
g3= 6.00000000000000088817841970012523233891
因此,如果有小数点15后的计算,则必须另想方法解决。这里,先记下1e-15这个近似为零的微小数值,有时可能比较有用。
B.取整函数nint(x)
取整函数nint(x)表示取最接近x的整数,简单说就是“四舍五入”取整。例如:
I=nint(5.1) !i=5,内部小数点后至少15位为零
J=nint(-7.8) !j=-8
问题来了,有时为何明显不正确呢?
例如下述计算:
ls1=1.2/0.12 0.5 !手算为10 0.5=10.5
!ls1内部为10.49999999999999822364316059974953532220
ls2=nint(ls1) !手算为11,但计算为10
ls3=1.3/0.13 0.5 !手算为10 0.5=10.5
ls4=nint(ls3) !手算为11,计算也为11
tiny=1e-15 !微值
ls5=nint(ls1 tiny) !正确
*sta
奇怪的是仅找到1.2/0.12一种情况,如1.1/0.11则是正确的。这个错误的原因不详,但取整时(x>0)增加一个微小值即可解决。
C.向下取整
某些情况下,要取不大于x的整数,即向下取整,这在ANSYS中无函数可用,但可用下述方法解决:
nint(x tiny-0.5)
如:js1=1.2/0.12
js2=nint(js1 tiny-0.5)
js3=-21.444444449
js4=nint(js3-tiny-0.5)
本文介绍了两个运算符、三个半个函数。两个运算符和未公布的max与min函数在apdl中灵活运用,会提高效率。而nint函数涉及了浮点数运算,并给出了向下取整方法。在APDL实际应用时,不宜蒙头编程,要注意检查运行结果,防止出现意想之外的结果。
在实际使用中,如有哪些明显的错误或意外情况,请留言交流。
声明:原创文章,欢迎留言与我讨论,如需转载留言