鱼C论坛

 找回密码
 立即注册
查看: 2041|回复: 4

[已解决]关于小于1的数的处理问题

[复制链接]
发表于 2021-10-7 13:44:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

在使用python进行计算的时候,数据如果很小,如0.0000001,它就会自己转化成科学计数法,然而不知为啥换成科学计数法之后计算得结果和原来有很大区别
困扰了我很久不知道怎么解决,下面是我写的代码,C、D、E均使用了科学计数法表示后面计算的时候就出现错误了,但我改成普通的小数后就行了
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: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 = V1
0.01743
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

print(a+b)
0.30000000000000004
C 语言
#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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 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 = V1
0.01743
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 16:45:18 | 显示全部楼层
傻眼貓咪 发表于 2021-10-7 16:43
你的题目运用太多浮点数,只能逐个加 round()

这样啊,太感谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 03:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表