赐福考官 发表于 2021-10-7 13:44:36

关于小于1的数的处理问题

本帖最后由 赐福考官 于 2021-10-7 13:54 编辑

在使用python进行计算的时候,数据如果很小,如0.0000001,它就会自己转化成科学计数法,然而不知为啥换成科学计数法之后计算得结果和原来有很大区别
困扰了我很久不知道怎么解决,下面是我写的代码,C、D、E均使用了科学计数法表示后面计算的时候就出现错误了,但我改成普通的小数后就行了{:5_104:}
b = 0.08445*(10**-3)
R = 8.314
V0 = 1
p = 1000000
T = 273.15
a = 8.664*(10**-6)*p
C = b+R*T/p
D = a/p
E = a*b/p


def f(V):
    return V**3-C*V**2+D*V-E


def f1(V):
    return 3*V**2-2*C*V+D


for i in range(100):
    if f(V0) == 0:
      print(V0)
      break
    elif f(V0) != 0:
      V1 = V0-f(V0)/f1(V0)
      if abs(V1-V0) < 0.001:
            print(V1)
            break
      V0 = V1

傻眼貓咪 发表于 2021-10-7 16:10:11

这就是程序语言的弱项,无论是 Python 或 C 或 java 等必然会有浮点精度问题(这是因为程序语言最基层是由 1 和 0 构筑而成,这里我就不多讲解,网路爬文解说应该比我好)。
示例:
Python 语言
a = 0.2
b = 0.1

print(a+b)0.30000000000000004C 语言#include <stdio.h>

int main()
{
    float a, b;
    a = 0.2;
    b = 0.1;
    printf("%.10f", a+b);
    return 0;
}0.3000000119解决方法:自行定义精度a = 0.2
b = 0.1
c = round((a+b), 3) # 只取浮点后3位精度

print(c)0.3

赐福考官 发表于 2021-10-7 16:28:49

傻眼貓咪 发表于 2021-10-7 16:10
这就是程序语言的弱项,无论是 Python 或 C 或 java 等必然会有浮点精度问题(这是因为程序语言最基层是由...

我开始也以为是精度的问题,查了之后也试过了round方法,但是发现主要原因是使用了科学计数法,如7.2e-11这样的值,虽然不知道为什么,但是我把变量改为数字0.000000000072之后却有用了,所以我想知道有没有什么办法能够把默认的科学计数法表示形式改为小数表示(我试过了分数表示,但这个代码是需要迭代的,整个过程耗时贼长),还请大佬帮助

傻眼貓咪 发表于 2021-10-7 16:43:12

你的题目运用太多浮点数,只能逐个加 round()
b = 0.08445*(10**-3)
R = 8.314
V0 = 1
p = 1000000
T = 273.15
a = 8.664*(10**-6)*p
C = b+round(R*round(T/p, 5), 5)
D = round(a/p, 5)
E = a*round(b/p, 5)

def f(V):
    return round(V**3-C*V**2+D*V-E, 5)


def f1(V):
    return round(3*V**2-2*C*V+D, 5)


for i in range(100):
    if f(V0) == 0:
      print(round(V0, 5))
      break
    elif f(V0) != 0:
      V1 = V0-round(f(V0)/f1(V0), 5)
      if abs(V1-V0) < 0.001:
            print(V1)
            break
      V0 = V10.01743

赐福考官 发表于 2021-10-7 16:45:18

傻眼貓咪 发表于 2021-10-7 16:43
你的题目运用太多浮点数,只能逐个加 round()

这样啊,太感谢了!{:5_102:}
页: [1]
查看完整版本: 关于小于1的数的处理问题