首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中浮点精度的动态变化

问Python中浮点精度的动态变化
EN

Stack Overflow用户
提问于 2017-12-12 22:36:38
回答 1查看 2.1K关注 0票数 1

我试图写一个程序,用不同的精度计算pi,并打印出数字和时间。我想打印的结果与当前的准确性,每次。我使用print('pi = %*f'%(i, pi)),i是我当前浮点精度的地方。这使得程序将数字舍入为i十进制数字。我正在附加一张图片,显示运行相同算法的结果,但将输出更改为:

print (" pi = ", pi, " =with ", i-1, " decimal points accuracy= in: ", (-1)*t, "sec")

至:

print (" pi = %.*f"%(i, pi), " =with ", i-1, " decimal points accuracy= in: ", (-1)*t, "sec")

这是我的完整代码:

代码语言:javascript
复制
import time
accuracy = 4
for i in range(1,accuracy + 1):
    pi = 0
    prevPi = 1
    x = 0
    t = time.time()
    while abs((pi * 4) - prevPi) > 10**((-1)*(i+1)):
    #while x < lim:
        prevPi = pi * 4
        pi += (((-1)**(x))/(1+(2*x)))
        #print(abs((pi * 4) - prevPi))
        x += 1
    pi *= 4
    t -= time.time()
    print (" pi = %.*f"%(i, pi), " =with ", i-1, " decimal points accuracy= in: ", (-1)*t, "sec")

​

​

如何在没有四舍五入的情况下打印带有i小数的数字?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-13 00:11:31

您可以通过定义截断数字的函数来解决问题。该函数可以采用两个参数:

  1. 你想截断的number,
  2. 在position,中,它将删除以下所有值。
代码语言:javascript
复制
def truncate(number, position):
    '''Return number with dropped decimal places past specified position.'''
    return number - number%(10**position)

例如,如果希望将数字3.14截断为3.1,则应调用以下命令:

代码语言:javascript
复制
truncate(3.14, -1)

此外,我修改了您的代码,使其更简单,并与PEP 8编码约定匹配。因此,现在它增加了变量命名的清晰度和更好的代码格式。

代码语言:javascript
复制
#!/usr/bin/env python3
'''Module for different pi accuracies calculation time comparison.'''

from time import time

def truncate(number, position):
    '''Return number with dropped decimal places past specified position.'''
    return number - number%(10**position)

def calculate_pi(accuracy):
    '''Return pi with certain floating point accuracy.'''
    previous_pi = 0 
    current_pi = 4 
    iterator = 1 
    while abs(current_pi - previous_pi) > 10 ** (accuracy-1):
        previous_pi = current_pi
        current_pi += 4 * ((-1)**iterator) / (1+(2*iterator))
        iterator += 1
    return truncate(current_pi, accuracy)

def calculation_speed_comparison(max_accuracy):
    '''Print comparison of different accuracy pi calculation time.'''
    for current_accuracy in range(max_accuracy+1):
        calculation_time = time()
        current_pi = calculate_pi(-current_accuracy)
        calculation_time -= time()
        print('pi = {} with {} decimal points accuracy in {} seconds.'.format(
            current_pi, current_accuracy, -calculation_time))

calculation_speed_comparison(4)

对此代码的输出与原始代码非常相似:

代码语言:javascript
复制
pi = 3.0 with 0 decimal points accuracy in 3.266334533691406e-05 seconds.
pi = 3.1 with 1 decimal points accuracy in 0.00016045570373535156 seconds.
pi = 3.14 with 2 decimal points accuracy in 0.0014882087707519531 seconds.
pi = 3.141 with 3 decimal points accuracy in 0.01430201530456543 seconds.
pi = 3.1415 with 4 decimal points accuracy in 0.1466822624206543 seconds.
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47782681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档