Python math库log函数计算异常求助:无法匹配计算器结果
Python math.log 计算与计算器结果不一致的问题及修复
我尝试用Python的math库log函数计算,但结果总是和计算器不一样,比如计算600 × log(600)时得不到正确值。以下三段代码仅在worst_mergesort的计算方式上有区别,分别用了rows * math.log(rows)、math.log(rows)、math.log(rows, rows),但都没解决问题:
代码片段1:使用math.log(rows)
# 导入math模块用于对数相关计算 import math # 询问用户表格的行数 rows: int = int(input('how many rows does the table have?')) def which_sort(rows: int) -> str: """ 该函数首先计算quicksort和merge sort的最坏情况时间复杂度。 若merge sort的最坏情况速度至少是quicksort的100倍,则使用merge sort,否则使用quicksort。 :param: rows - 表示表格行数的整数。 """ # 若rows <= 1,worst_mergesort将为0,会导致除零错误 if rows <= 1: return 'use quicksort' # 计算最坏情况的时间复杂度 worst_quicksort: int = rows**2 worst_mergesort: int = math.log(rows) print(worst_mergesort) print(rows) # 检查merge sort的最坏情况是否比quicksort快至少100倍 if worst_mergesort <= (worst_quicksort / 100): return 'use merge sort' else: return 'use quick sort' which_sort(rows)
代码片段2:使用math.log(rows, rows)
# 导入math模块用于对数相关计算 import math # 询问用户表格的行数 rows: int = int(input('how many rows does the table have?')) def which_sort(rows: int) -> str: """ 该函数首先计算quicksort和merge sort的最坏情况时间复杂度。 若merge sort的最坏情况速度至少是quicksort的100倍,则使用merge sort,否则使用quicksort。 :param: rows - 表示表格行数的整数。 """ # 若rows <= 1,worst_mergesort将为0,会导致除零错误 if rows <= 1: return 'use quicksort' # 计算最坏情况的时间复杂度 worst_quicksort: int = rows**2 worst_mergesort: int = math.log(rows, rows) print(worst_mergesort) print(rows) # 检查merge sort的最坏情况是否比quicksort快至少100倍 if worst_mergesort <= (worst_quicksort / 100): return 'use merge sort' else: return 'use quick sort' which_sort(rows)
代码片段3:使用rows * math.log(rows)
# 导入math模块用于对数相关计算 import math # 询问用户表格的行数 rows: int = int(input('how many rows does the table have?')) def which_sort(rows: int) -> str: """ 该函数首先计算quicksort和merge sort的最坏情况时间复杂度。 若merge sort的最坏情况速度至少是quicksort的100倍,则使用merge sort,否则使用quicksort。 :param: rows - 表示表格行数的整数。 """ # 若rows <= 1,worst_mergesort将为0,会导致除零错误 if rows <= 1: return 'use quicksort' # 计算最坏情况的时间复杂度 worst_quicksort: int = rows**2 worst_mergesort: int = rows * math.log(rows) print(worst_mergesort) print(rows) # 检查merge sort的最坏情况是否比quicksort快至少100倍 if worst_mergesort <= (worst_quicksort / 100): return 'use merge sort' else: return 'use quick sort' which_sort(rows)
问题原因及解决方案
核心问题
- 对数底数不匹配:Python的
math.log(x)默认计算自然对数(ln,底数e≈2.718),而普通计算器默认是常用对数(log10,底数10),这是结果不一致的主要原因。 - 错误的对数用法:
math.log(rows, rows)计算的是log_rows(rows),结果恒为1,完全不符合归并排序O(n log n)的时间复杂度公式。 - 类型强制错误:将浮点型的对数计算结果强制转为
int,会丢失精度导致结果偏差。
修复方案
归并排序的最坏时间复杂度是O(n log n),算法分析中通常以2为底,根据需求选择对应对数函数:
- 若要和计算器默认的常用对数一致,用
math.log10() - 若用自然对数,保留
math.log(),但计算器需切换到ln模式 - 若要以2为底(算法分析标准),用
math.log2()
同时,不要将浮点结果强制转为int,避免精度丢失。
修复后的代码示例(以2为底的对数):
import math rows: int = int(input('how many rows does the table have?')) def which_sort(rows: int) -> str: if rows <= 1: return 'use quicksort' worst_quicksort = rows ** 2 # 用math.log2计算以2为底的对数,符合算法分析中的时间复杂度定义 worst_mergesort = rows * math.log2(rows) print(worst_mergesort) print(rows) if worst_mergesort <= (worst_quicksort / 100): return 'use merge sort' else: return 'use quick sort' which_sort(rows)
比如计算600时:
- 修复后的值:
600 * log2(600) ≈ 600 * 9.22 ≈ 5532 - 若用常用对数:
600 * log10(600) ≈ 600 * 2.778 ≈ 1666.8 - 若用自然对数:
600 * ln(600) ≈ 600 * 6.397 ≈ 3838.2
根据计算器的对数模式选择对应函数即可得到一致结果。
内容的提问来源于stack exchange,提问作者Stan
相关产品推荐
相关产品推荐

