![post-title](https://i.ytimg.com/vi/_RsaNzZFuUU/hqdefault.jpg)
python不要小數點 在 コバにゃんチャンネル Youtube 的最佳解答
![post-title](https://i.ytimg.com/vi/_RsaNzZFuUU/hqdefault.jpg)
Search
則補充:取小數的方法. 在開始之前,我得先說明一件事情:. 字串(string)是比浮點數(float)更精確 .. ... <看更多>
則補充:取小數的方法. 在開始之前,我得先說明一件事情:. 字串(string)是比浮點數(float)更精確 .. ... <看更多>
#1. [Day 04] 從零開始學Python - 型態轉換及字串基礎 - iT 邦幫忙
比如int和float的互轉,只需要使用int()或float()即可。 我們來看一下int和float轉換的範例: >>> float(1) # 從沒有小數點的int變成帶小數點的float 1.0 >>> int(1.0) ...
本教程將介紹在Python 中各種截斷浮點數的方法。浮點數的截斷用於簡化計算。我們可以通過刪除剩餘數字或四捨五入來截斷一個浮點數。我們將在本教程中 ...
#3. Python-四捨五入/無條件進位/無條件捨去| Yiru@Studio
四捨五入round()無條件進位= 需import mathmath.ceil()無條件捨去= 需import mathmath.floor()
在python2 中使用/ 做除法的时候,没有小数点,所以如果要保留小数点的话,需要导入一个包from __future__ import division在python3中,一个算数表达 ...
#5. Python 浮點數四捨五入,無條件進位,無條件捨去floats ...
Python 對浮點數做四捨五入,無條件進位,無條件捨去的方式如下。 Python的 round() 函式可以做四捨五入,但「五入」的規則和以前學的數學不太一樣。
这篇文章将讨论如何在Python 中将浮点数限制为两位小数... 将浮点数限制为两位小数的简单解决方案是使用内置函数“round(x[, n])”。
我們將在之後的教學中看到更多數字相關的型態。 除法( / ) 永遠回傳一個float。如果要做floor division 並拿到整數的結果(即去除所有小數 ... 點數數值和字 ...
#8. 比較Python 與除法相關的運算子與函式– /、//、% 與divmod
在除數、被除數皆為整數的時候, / 運算子為「向下取整除法」(floor division) — 除完後會執行floor 函式無條件捨去小數點。比方說2/3 較精確的計算結果應該 ...
#9. 15. 浮點數運算:問題與限制
在計算機架構中,浮點數(floating-point number) 是以基數為2(二進位)的小數表示。例如說,在十進位小數中0.125 可被分為1/10 + 2/100 + 5/1000,同樣的道理, ...
如何在Python中列印額外的小數位? 使用round()函數列印一個小數點後6位的浮點數,例如:print(round(my_float, 6)) 。
#11. Python四捨五入與保留小數位數(精確舍入與保留)
1.1 四捨五入並保留x位小數——用decimal模塊中的Decimal方法(精度高) ... Decima(a)中的a需要是字符串形式的數字,而不能直接是浮點型數字,因爲浮點型數據 ...
#12. *Python* 格式化輸出小數點為0不顯示
版本PythonV3.6 format 使用 print("{:g}".format(BMI)) 使用螢光筆觸選擇g 'g' : 一般格式給定一精度P>=1 將數字將有效位元保留並根據其大小進行格式 ...
#13. ROUNDDOWN函數]將數值四捨五入、無條件進位、無條件捨去 ...
想處理小數點的左側(整數部分)時,指定0或負數。 補充. ROUND函數與YEN函數的差異. ROUND函數的計算結果不會附加「¥( ...
#14. Python基礎—格式化輸出(%用法和format用法)
ndigits - 表示從小數點到最後四捨五入的位數。默認值為0。 返回值. 該方法返回x的小數點捨入為n位數後的值。 round()函數 ...
#15. 详谈python中的小数运算,以及四舍五入不精确问题
而相比之下,整数则完全不需要担心这样的精度换算问题,这也是计算机语言中,需要特地区分整形(integer)和浮点型(float)的原因。Python中,选择用8 ...
#16. python去掉小数点后的零
还有一种方法是使用decimal 模块中的quantize() 方法,它可以对小数进行舍入并去除多余的0: from decimal import Decimal num = 2.50000 print(Decimal(num).quantize ...
#17. Python數字類型 - 極客書
float (浮點實數值) : 或浮點數,表示實數,並寫入一個小數點分隔的整數部分和小數部分。浮點數也可以是科學記數法,用e或E表示的功率10 (2.5e2 = 2.5 x 10 2 = ...
#18. 文字與字串( 格式化) - Python 教學 - STEAM 教育學習網
下面的例子可以看到{:-^10s} 會將world 置中對齊,並將不足最小寬度的部分補上- 的符號,{:^10.3f} 會讓123.456789 只留下小數點三位。 ... 去除中英文夾雜的空白 大樂透 ...
#19. 小狐狸事務所: Python 學習筆記: 用print() 函式輸出格式化字串
... 不要換行則需用end 設定為其它字串, 例如end 設為空字元會讓下一次print() 的 ... 注意, 浮點數的寬度包含小數點, 資料寬度超過此指定寬度時不會被截斷 ...
#20. Python中控制小数位数以及整数补零问题- 助手的fork
类型转换:float(),会使整数加上.0 。 Python中的格式化字符串: '%4d' % ( a )输出一个4个字节宽度的整数字符串,如果整数a 不满4 个字节, ...
#21. python 如何将浮点数尾部无效0去掉和无效的'.'号
... 点,例如:101.11 就是一个二进制小数 ... python通过floor函数舍弃小数位的方法 · Python如何保留float类型小数点后3位 · 使用Python去除小数点后面多余的0 ...
#22. 數字· Introducing python - iampennywu
一般的零(0). 不要將零放在其他數字前面,會出現例外錯誤 >>> 0 0 >>> 05 ... 整數是完整的數字,但浮點數(Python中稱float )會有小數點。 浮點數的處理方式 ...
#23. 【Pandas】資料表內的數字超多位數:round都無法解決嗎 ...
超多位數嗎?趕快看過來一招搞定一、前言常常遇到資料表(df)裡面的資料超級多位數嗎?明明我就只想要到小數點 ... 【Python量化資料】. 【Python取得資料】 ...
#24. Python除法:四舍五入,地板除,取整,取小数 - 桔子code
Python 除法:四舍五入,地板除,取整,取小数 · 1、除法/ · 2、四舍五入round() · 3、浮点数取整int() · 4、地板除// · 5、向上取整math.ceil() · 6、取小数和 ...
#25. Python 的round() 與decimal 模組
這是因為 round() 並不是看小數第3 位, 而是以2.2251 來看, 2.23 要比2.22 接近2.2251, 因此結果為2.23。 浮點數潛在的誤差. 浮點數因為是以2 進位的有限 ...
#26. python浮點數的位數取捨和四捨五入問題
... 小數點直接保留幾位,沒有其他運算規則;3.ROUND函數,按指定位數進行四捨五入的數值;4.INT函數,將數值向下取整爲最接近的整數;5、快捷鍵直接去除小數點 ...
#27. Python 的格式化字串功能
所以此例就是小數2 位加上小數點本身以及個位數3 共4 個字, 轉換後的結果還會在3 ... 不要引發例外, 可以改用 safe_substitute() 方法, 它會在置換結果中保留原始的置換 ...
#28. Python 中关于round 函数的小坑
这个一直都想写,但是因为这个点比较小,所以一直懒得动手。不过还是补上吧,留着早晚是个祸害。 round函数很简单,对浮点数进行近似取值,保留几位小数。
#29. python入門(一)小康小白
... 不要和Python關鍵字重合(比如前面學習過的:and、or、not,否則可能導致 ... 小數點位數使用Python計算小數的時候,經常需要保留小數點後若干位,可以 ...
#30. Python去除小数点后面多余的0
Python 去除小数点后面多余的0,最近在用Python写导入数据的脚本。百度 ... python float python float去掉小数后的0. 去除python中数据的0值 import ...
#31. Chapter 1 變數(Variable)
整數(integral):Python中可以處理任意大小的整數(Python 2.x中有int和long兩種類 ... 浮點數(float):浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示 ...
#32. 布魯斯Python AI程式自動評量網
Python 程式考題作答立即自動評量, 讓 ... 注意:輸出應付金額不要有小數點。 學習重點: 熟悉多向條件判斷. 題目程度: 容易.
#33. 除了不要使用round 四捨五入,需要再透過加減一個誤差數值 ...
由於Python 的小數點並非真正顯示的長相,所以如果單純計算或使用round ... 除了不要使用round 四捨五入,需要再透過加減一個誤差數值0.00001 ( 比計算 ...
#34. Python: 格式化字串.format() 順序order,關鍵字keyword,索引 ...
... 索引index .2% 換算為百分比,精準到小數點下兩位. by 儲蓄保險王 · 2023-06-11. 加入好友 ... 使用關鍵字不要忘記 name=name, age=age (賦值給關鍵字) 順序不需要.
#35. 5.Python 數字、字串的定義、運算與格式化
預設小數點後精度6 位。使用E 輸出大寫。 ''' name = "andy" password ... 如果可以盡量不要使用複製的,這樣學習效率差,但要記得每次更改檔案後都要 ...
#36. Python 2 Tutorial 第二堂(1)數值與字串型態
... 小數部份,若進行 // 則會截去小數部份: >>> 10 / 3 3 >>> 10 // 3 3 >>> 10 / 3.0 ... 點數,原因可看看Python Taiwan 社團的討論: >>> 10 / 3 3.3333333333333335 ...
#37. python怎么让小数最后一位不为0
先转为字符串,再用rstrip去除末尾0,再把字符串转回float。 num = float(str(float(num)).rstrip('0')) ...全文. t59616. 2015-11-10 TA获得超过784个赞. > ...
#38. Python/字符串- 維基教科書,自由的教學讀本
... 小數點。. 缺點:不同平台的編輯器會將tab 字元視為不同長度,用不同編輯器打開 ... 如何理解Python装饰器? - Python ) 去除或取代字串中的內容例如:數字或指定類型 ...
#39. python小數點的問題包括PTT、Dcard、Mobile01,我們都能 ...
則補充:取小數的方法. 在開始之前,我得先說明一件事情:. 字串(string)是比浮點數(float)更精確 ..
#40. Python 几种取整的方法
1、向下取整 · 2、四舍五入 · 3、向上取整 · 4、分别取整数部分和小数部分.
#41. python浮點數在Youtube上受歡迎的影片介紹|2022年08月
... 不要重複出現09_102浮點數格式化輸出解答10_104. 圓形面... post-title. 10 ... python 小數點python怎么控制小數點位數?比如float類· Python資料分析 ...
#42. decimal 和numeric (Transact-SQL) - SQL Server
SQL 機器學習服務(R 和Python) · SQL Server R 服務 · Azure Machine Learning ... 小數點右側所能儲存的小數位數。 這個數字會從p 中減去,以判斷小數點 ...
#43. 格式化具有小數點的數字
Python : Programming with Python · Python : Screen Input/Output. Script ... 如果您只想要修改顯示的小數位數,最容易的方式就是使用[格式] 列上的數字格式:增加小數點 ...
#44. 如何判斷兩個浮點數是否相等?是否能整除?相除後餘數是 ...
這裡要特別注意的是,在判斷一個浮點數是否為整數的時候,不要使用 ceil 或是 floor 函數來消除小數,因為有誤差的值可能會比原值大或是小。好比 1/ ...
#45. 在Python 中打印浮点值 - 迹忆客
请注意 ,print() 函数返回None,因此不要尝试将调用print 的结果存储在变量中。 我们可以使用格式化的字符串文字来打印四舍五入到N 位小数的浮点数。
#46. Python技法:浮點數取整、格式化和NaN處理
首先,在真實世界中極少有東西需要計算到小數點後17位( float 提供17位的精度 ... 我在不要更新挑戰中堅持了一年 ,你也來試試吧(咕咕咕)! 好言歸正傳,本次 ...
#47. Python串列(list) 基礎與23個常用操作
如果使用浮點數(float) 或者提取的位置範圍超過了,Python 都會回傳錯誤給你。 當你填入浮點數,就是有小數點的數字,會出現TypeError。 >>>letters ...
#48. 程式語言觀念先知
7 連續輸入多個整數(直到輸入小數點. 為止),顯示(1)這些數字的加總結果及平均值 ... python 的資料型態有數字、字串、容器,除了List,還有turple、set、dictionary 等.
#49. (寫程式玩數學#2)平方根的小數點後第100位要怎麼算? - YouTube
... 不要 再帶出國了!|林宣Xuan Lin. 林宣Xuan Lin New 17K views · 21:17 · Go to channel · 【ASMR碼APP】 Python 找質數:米勒拉賓檢驗法. 小哈片刻•528 ...
#50. 第四單元程式的輸出入
寬度是6, 小數取2 位,小數點一位,整數剩3 位。以上輸出都是. 預設靠右,若要左靠 ... 其次,Python 將輸入的東西一律視為字串,所以,若您要進行數. 值運算,那請先用 ...
#51. Plain Text File.txt
浮點數也就是小數,之所以稱為浮點數,是因為按照科學記數法表示時,一個浮點數的 ... Python裡面的「陣列」(Array)一共有四種類型: 串列(List) 串列(或稱「列表 ...
#52. 使用Decimal 提高浮點運算精確度 - dw's 小站
因為浮點數是利用二進位的小數來做儲存,對於非二進位的數字會有誤差。 ... 為了提高精確度,我們可以提高儲存的位元。 Decimal module. Python 提供了一個 ...
#53. 使用Python去除小数点后面存在多余0的问题
...是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。 在python3.x 中/ 除法不再这么做了,对于整数之间的相除, ...
#54. python 小数点百分比互转-腾讯云开发者社区
小数 转换位百分比. 方法一. a = 0.3214323 bb = "%.2f%%" % (a * 100) print bb. 输出结果 ... 不要在此处直接复制代码! 在Python中可以执行对整数、浮点数的加减乘除运算 ...
#55. 作業成果- 開n次方根函式
#56. 在Python中判断两个浮点数的相等 - 零壹軒
精度丢失¶. >>> 0.1 + 0.2 0.30000000000000004. 简单地说,$0.1$在二进制中,是一个无限循环小数$0.0\ ...
#57. decimal ---小数不动点和浮点运算— Python 3.10.0a4 文档
在3.3 版更改. 小数可以很好地与其他大部分Python交互。下面是一个小的十进制浮点数 ... 在单线程环境中,最好不要使用此上下文。相反,只需按照下面的描述显式地创建 ...
#58. 【問題】(初學者)關於小數點後四捨五入顯示問題
... 小數點第二位的0不要省略呢? 請求 ... 問題[Python]請問如何使用排列組合解出這題(初學者,求詳細易懂得解法~~). 2019-04-07 22:04:46. 問題C++初學 ...
#59. 請益Python 小數點誤差- 軟體工程師板
#請益Python 小數點誤差 ... 輸出為: 605.014 605.013 如題,在做題目時發現用兩種方式取小數位,最後一位總是會差1 上網找確定兩種方式對於指定位數都是以 ...
#60. [心得] 計算π到小數點下十億位 超進化版- 看板Python
和上篇一樣,這篇是把計算圓周率π的程式照樣修改, 執行速度也快了兩倍多, 原本十億位需要1 小時28 分鐘,縮短到40 分鐘速度變快的關鍵主要出在三 ...
#61. 無門檻學會python資料型別與輸入、輸出函式
... 小數點的,浮點先不要考慮。 又一次需要用到一個後續才會明確的知識點,叫做Python 內建函式,將整數轉換成二進位制格式顯示用到的函式叫做bin,程式 ...
#62. Python程式語言part1
▻ Python的π 精確到小數點後16位 import math x = float(input("請輸入x ... ▻ 一般以四個空白,不要用Tab縮排. Page 77. Ch4.流程圖與判斷結構. ▻ if ...
#63. Judge Girl - ddns.net
注意全型與半型字元不要打錯。 注意小數點的位數要與題目規定相同。 注意英文字母的大小寫是否相同。 程式最後必須要可以在題目規定的時間內結束 ...
#64. Python練習題-TQC+(608)-最大最小值索引| Yiru@Studio - 點部落
Python 練習題-TQC+(608)-最大最小值索引 · // 它可以除完後去除小數點 · % 可以幫助我們取得餘數 · 最後記得打字時不要打錯字,冒號跟逗號後面都有空格.
#65. 手把手學Python - 最簡單的資料型別整數(int) 與字串(str)
這些請在IDLE 裡, 自己試試看, 你會更了解這些整數的運算。其實, 就因為在Python 裡, 整數的除法如果出現小數, 就會自動轉成浮點運算, 所以在官方的文件裡 ...
#66. Data types, variables, and operators 資料型態、變數和運算子
... 不要被它們 ... 小數點或小數點後的數字,就是浮點數。 Python 的整數沒有特定的大小限制,取決於執行的記憶體空間。 Python 浮點數採用IEEE-754 雙精度浮點 ...
#67. [Python] 取數值小數點的方法(指定位數、四捨五入)
取小數的方法. 在開始之前,我得先說明一件事情:. 字串(string)是比浮點數(float)更精確 ...
#68. Python 基礎江清水撰寫東吳大學資訊管理系教授(2015/11)
注意到上面的七個不同的運算,其中六個. 的計算結果都是整數,只有除法不一定會產生整. 數的結果,所以python 會給一個有小數點的數 ... 但是不要使用a,b,c= ...
#69. 關於Decimal 小數尾數零
C#的實數型別有三種:float、double、decimal。其中float、double 為浮點數,本站的老讀者們一定知道-「算錢用浮點,遲早被人扁」的道理, ...
#70. Python程式設計- 基本資料運算
Python 語言在宣告變數時,不要考慮資料的範圍,會⾃動根據變數值採用 ... 點數的小數點也佔⼀ 個寬度。若寬度比資料本身寬度小,則以資料實際寬度 ...
#71. [Python教學] 寫給新手的Python入門操作
# 將小數點轉換成百分數. 1. format('1.22','.0%'). # 將df 的小數點轉換成 ... dataframepandasPythonpython基礎python教學. 文章導覽. [關聯分析] Apriori ...
#72. 資料科學家的pandas 實戰手冊:掌握40 個實用數據技巧
改變浮點數顯示位數¶. 除了欄位長度以外,你常常會想要改變浮點數(float)顯示的小數點位數:. pd.set_option("display.precision", 1) df.head(3) ...
#73. 如何在Python 裡面精確四捨五入?
今天又有一個Python初學者被中文技術博客中的垃圾文章給誤導了。 這位初學者的問題是:. 在Python中,如何精確地進行浮點數的四捨五入,保留兩位小數?
#74. Python資料類型教學:type函數及float浮點數數值應用
再稍微修改都市,在這裡主要將「int」更改為「float」。float在資料類型是指帶有小數的數值,通常稱之為浮點數數值(floating-point number)。可以從兩 ...
#75. Java中的取余运算|21xrx.com
然而在使用过程中需要注意不要对0进行取余运算,以避免出现异常。 上一篇 ... 在本文中,我将详细介绍ArrayList类的一些常用方法。 Python使用ffmpeg进行声 ...
#76. <input>:输入(表单输入)元素- HTML(超文本标记语言)
输入文本中的换行会被自动去除。在支持的浏览器中可能有一个删除按钮,用于清除整个 ... 用于输入基于UTC 时区的日期和时间(时、分、秒及秒的小数部分)。
#77. python 除法保留兩位小數點的方法- IT閱讀
以上這篇python 除法保留兩位小數點的方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援itread01.com。 相關文章. Angular ...
#78. Cron表达式校验工具
Cron表达式校验工具. Cron表达式: 查看执行结果 清空结果. Demo(每日十二点 ...
#79. const和define有什么区别? - 面包板社区
当然,我们正在说的C++也是有const的,在一些编程语言中也会有相应的替代方案来实现不可变的特性,比如Java就可以通过final关键字,而Python语言层面 ...
#80. 第7章给我一个机会
翟兮颜脸一僵:“姐姐,不要开这样的玩笑。” “你觉得是开玩笑吗?”郑婉低头微微一笑 ... python 取二位小数 · 新春活动没想法?没创 · 最强纨绔系统漫画免费观看 · plsql能 ...
#81. Python X ChatGPT:零基礎AI聊天用流程圖學Python程式設計(電子書)
... 點數的字元是 f,同樣可以指定寬度 6 位數(不含小數點),精確度 3 是小數點下 3 位 ... 不要忘了字串前的 f,字串中的{x}和{y}就是放置變數 x 和 y F 格式化字串也可以指定 ...
#82. 遇見樹莓派 - 使用Python入門趣玩GPIO - 第 116 頁 - Google 圖書結果
... 小數點dp的腳位編號 4 GPIO.setmode(GPIO.BOARD) 5 seg7 = [5, 33, 19, 15, 13, 7 ... 不要弄錯。 3.第 7 ~ 8 行是設定所有 a ~ g 腳位均為輸出,第 9 ~ 10 行是設定所有 ...
#83. 嫁给傻太子后,相国公子沦陷了第六章大婚当日在线免费阅读
“确实有道理,有道理,说得不错,下次不要说了,我听一次就可以了。”瑾瑜 ... python 调用其它文件中的函数 · js四舍五入保留小数点后两位小数 · 我,高维 ...
#84. Python功力提升的樂趣|寫出乾淨程式碼的最佳實務(電子書)
... 小數點的數字,不用管十進位到二進位的轉換過程: >>> 0.3 0.3 雖然具體情況的詳細資訊不在本書的討論範圍之內,但 IEEE ... Python 誤解和陷阱 不要假設浮點數是完全精確的.
#85. Python初學特訓班(第五版):從快速入門到主流應用全面實戰(電子書)
... Python 的保留字 2.1.3 數值、布林與字串資料型態 Python 數值資料型態主要有整數(int)及浮點數(float)。整數是指不含小數點的數值,浮點數則指包含小數點的數值,例如 ...
#86. Python初學特訓班(第三版):從快速入門到主流應用全面實戰(電子書)
... Python 的保留字 2.1.3 數值、布林與字串資料型態 Python 數值資料型態主要有整數(int)及浮點數(float)。整數是指不含小數點的數值,浮點數則指包含小數點的數值,例如 ...
#87. Python自學聖經(第二版):從程式素人到開發強者的技術與實戰大全(電子書)
... 點數 08 整數(int)及浮點數(float)是數值資料。整數是指不含小數點的數值,浮點數則指包含小數點的數值,例如: 09 num1 = 34 #整數#浮點數若整數數值要指定為浮點數資料 ...
#88. Python 3.7 技術手冊(電子書) - 第 3-39 頁 - Google 圖書結果
... 小數點,而是使用分數及指數來表示小數。如果需要處理小數,而且需要精確的結果 ... 不要再用<>,使用!=比較清楚,<>只是為了相容性而存在。比較運算有個很 Python 的特色 ...
#89. Python 數字運算
這邊需注意的是Python 3.5 則會印出真實運算結果,而Python 2.7 的運算,則會將小數點無條件捨去進位。 ... 可以使用type 函式來查詢變數值的型態。 # float ...
#90. 《同桌h文》资源列表 - 茂华生物
python 做多元回归分析 · 王者组队消费怎么领取 · 女鞋尺码图 · 华为手机录音转文字怎么 ... 不要停 下脚步,向前走是最好的解决办法。不要害怕失败,付出总会有回报。只要你 ...
#91. Python 3.5 技術手冊(電子書) - 第 3-38 頁 - Google 圖書結果
... 小數點,而是使用分數及指數來表示小數。如果需要處理小數,而且需要精確的結果 ... 不要再用<>,使用!=比較清楚,<>只是為了向後相容性(Backwards compatibility)而存在 ...
#92. Python Round 函数——如何向上或向下舍入到最接近的整数
... python/] ,作者:Ihechikara Vincent Abba [https://www.freecodecamp.org/news/author/ihechikara/] 当我们在Python 程序中使用浮点 ... 小数位数,默认 ...
#93. Python 新手日記int() float() input() - Those words in my head.
這樣理解過後就可以明白為什麼有小數點的string是不可直接算的,因為不管哪一種進位方式都不會出現小數點。 這也說明為什麼小數點數值需要另外分成一類( ...
#94. python不保留小数的方法有哪些
这篇文章主要介绍了python不保留小数的方法有哪些,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。
python不要小數點 在 [心得] 計算π到小數點下十億位 超進化版- 看板Python 的推薦與評價
和上篇一樣,這篇是把計算圓周率π的程式照樣修改,
執行速度也快了兩倍多,
原本十億位需要 1 小時 28 分鐘,縮短到 40 分鐘
速度變快的關鍵主要出在三處:
1. mpfr.div() 原本寫錯了,應該要把整數的 mpz 轉成浮點數 mpfr 再除比較快,
我卻寫錯了,直接拿 mpz 去除,不知為何這樣會讓運算速度變得超級慢。
2. 寫檔時 write_string() 裡面有做排版,而這個排版的迴圈是一個字元一個字元
處理,速度非常的慢,我改成一次處理 50 個字元一行,速度就快了 50 倍。
3. 進度條處理得不好,不需更新進度時應該儘快 return,我卻做了多餘的
數學運算,多做一次當然沒什麼,多做七千萬次就有影響效能了。
這個 Divide and Conquer 的寫法很適合 multi-processing,
以及進度條可以改用 tqdm module,這些建議都不錯,
不過請體諒我才剛學 Python 沒幾天,需要點時間消化 (汗)
這次程式碼也放在 https://ideone.com/6YO1zU 方便大家複製貼上
#!/usr/bin/env python3
#
# pi.py - Calculate Pi
#
import sys
import time
import math
import gmpy2
from gmpy2 import mpfr
from gmpy2 import mpz
#
# Global Variables
#
count = 0
total = 0
grad = 0
step = 0
#
# Show Progress
#
def progress_init(max):
global count, total, grad, step
total = max
count = 0
step = int(total / 1000)
grad = int(step / 2)
def progress():
global count, total, grad, step
if (count > grad):
grad += step
g = int(math.floor(72.5*count/total+0.5))
p = int(math.floor(1000.5*count/total+0.5))
msg = "H" * g + "-" * (72-g) + " " + str(p/10) + "%\r"
if (grad > total):
msg += "\n"
print(msg, sep="", end="", flush=True)
#
# Write digit string
#
def write_string(digit_string):
fd = open("pi-py.txt", mode="w")
fd.write(" pi = ")
fd.write(digit_string[0])
fd.write(".")
for c in range(1, len(digit_string), 50):
if (c != 1):
fd.write("\t")
fd.write(digit_string[c:c+50])
if ((c % 1000) == 951):
fd.write(" << ")
fd.write(str(c+49))
fd.write("\r\n")
elif ((c % 500) == 451):
fd.write(" <\r\n")
else:
fd.write("\r\n")
# Final new-line
fd.write("\r\n")
fd.close()
#
# Recursive funcion.
#
def s(a, b, max):
global count
m = math.ceil((a + b) / 2)
if (b - a == 1):
if (a == 0):
r = 120 # 6!
q = mpz(640320**3)
p = gmpy2.sub( gmpy2.mul(q, 13591409),
gmpy2.mul(r, 13591409+545140134) )
else:
r = mpz(8 * (a*6+1) * (a*6+3) * (a*6+5))
q = mpz((b*640320)**3)
if ((b%2) == 0):
p = gmpy2.mul(mpz(13591409 + b*545140134), r)
else:
p = gmpy2.mul(mpz(-13591409 - b*545140134), r)
else:
p1, q1, r1 = s(a, m, max)
p2, q2, r2 = s(m, b, max)
# Merge
p = gmpy2.add( gmpy2.mul(p1, q2), gmpy2.mul(p2, r1) )
q = gmpy2.mul(q1, q2)
if (b != max):
r = gmpy2.mul(r1, r2)
else:
r = 0
count += 1
progress()
return p, q, r
#
# Calculate e
#
def calc_pi(digits):
global total
d = digits+1
n_terms = math.ceil(d*math.log(10)/(3*math.log(53360)))
precision = math.ceil(d * math.log2(10)) + 4
print("d = ", d, ", n = ", n_terms, ", precision = ", precision, sep="")
print("gmpy2 version:", gmpy2.version())
print("MP version:", gmpy2.mp_version())
print("MPFR version:", gmpy2.mpfr_version())
max_precision = gmpy2.get_max_precision()
print("max_precision =", max_precision)
max_emax = gmpy2.get_emax_max()
print("max_emax =", max_emax)
if (max_precision < precision):
print("Error! Max precision is too small! Program terminated.")
return
gmpy2.get_context().precision = precision
gmpy2.get_context().emax = max_emax
print("Real precision = ", gmpy2.get_context().precision)
progress_init(n_terms * 2 - 1) # Initialize progress bar
# Recursion
start_time = time.monotonic_ns()
p, q, r = s(0, n_terms, n_terms)
end_time = time.monotonic_ns()
elapsed = (end_time - start_time) / 1000000000
print("Recursion:", elapsed, "seconds.")
start_time = time.monotonic_ns()
q = gmpy2.mul(q, 426880)
end_time = time.monotonic_ns()
elapsed = (end_time - start_time) / 1000000000
print("Multiply by 426880:", elapsed, "seconds.")
start_time = time.monotonic_ns()
pf = mpfr(p)
qf = mpfr(q)
ef = gmpy2.div(qf, pf)
end_time = time.monotonic_ns()
elapsed = (end_time - start_time) / 1000000000
print("Grand Division:", elapsed, "seconds.")
start_time = time.monotonic_ns()
ef = gmpy2.mul(ef, gmpy2.sqrt(10005))
end_time = time.monotonic_ns()
elapsed = (end_time - start_time) / 1000000000
print("Multiply by sqrt(10005):", elapsed, "seconds.")
# Convert to decimal digits
start_time = time.monotonic_ns()
estr, exp, prec = mpfr.digits(ef)
estr = estr[0:d]
end_time = time.monotonic_ns()
elapsed = (end_time - start_time) / 1000000000
print("Convert to decimal digits:", elapsed, "seconds.")
# Write to file
start_time = time.monotonic_ns()
write_string(estr)
end_time = time.monotonic_ns()
elapsed = (end_time - start_time) / 1000000000
print("Write to file:", elapsed, "seconds.")
#
# main program
#
if __name__ == '__main__':
argc = len(sys.argv)
if (argc >= 2):
digits = int(sys.argv[1])
else:
digits = 100000
calc_pi(digits)
# End of pi.py
--
桃樂絲: 可是, 如果你沒有頭腦, 為什麼會說話?
稻草人: ㄝ, 我也不知... 但是有些人沒有頭腦也能說超~多話呢。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.165.64.143 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1614281244.A.F7F.html
雖說有聽人講過,用 Python 就不要太期待效能,
但這不妨礙我繼續追求更高的執行速度
最終能和 C 語言版差不多快也是始料未及......
※ 編輯: Schottky (118.166.39.82 臺灣), 03/07/2021 09:16:36
... <看更多>