NEP 3 — 清理 numpy.core 的數學配置#

作者:

David Cournapeau

聯絡方式:

david@ar.media.kyoto-u.ac.jp

日期:

2008-09-04

狀態:

已延遲

執行摘要#

在建置 numpy.core 之前,我們會使用一些組態測試來收集關於可用數學函數的一些資訊。多年來,組態變得複雜,以至於難以輕鬆支援新平台。

本提案的目標是清理數學功能的組態,以便更輕鬆地維護。

目前的問題#

目前,數學組態主要測試一些數學函數,並據此配置 numpy。但是,目前的系統並非獨立測試每個所需的函數,而是更多地作為解決特定平台異常問題的變通方案而開發,使用了平台隱含的知識。這違反了僅測試功能的正常哲學,也就是 autoconf 哲學,它展示了通往可移植性的道路(至少在 Unix 上)[1]。這會導致問題,因為在現有平台上修改或新增組態會破壞隱含的假設,而沒有明確的解決方案。

例如,在 Windows 上,當使用 mingw 建置 numpy 時,最好強制執行組態 sizeof(long double) == sizeof(double),因為 mingw 使用 MS runtime,而 MS runtime 不支援 long double。不幸的是,這樣做會破壞 mingw 數學函數偵測,因為隱含的假設是 mingw 的組態 sizeof(long double) != sizeof(double)。

另一個例子是僅使用一個函數來測試一組函數:如果找到 expf,則假定所有基本 float 函數都可用。相反地,應該獨立測試每個函數(expf、sinf 等...)。

需求#

我們有兩個強烈的需求
  • 不應破壞任何目前支援的平台

  • 不應使組態變慢太多(1-2 秒是可以接受的)

提案#

我們建議打破任何隱含的假設,並像 autoconf 通常所做的那樣,彼此獨立地測試每個數學函數。由於測試大量函數可能會很耗時,因此我們將使用類似於 autoconf 中 AC_CHECK_FUNCS_ONCE 的方案,也就是一次測試一組函數,並且僅在它中斷的情況下才執行每個函數的檢查。當第一次檢查有效時,它應該與目前的方案一樣快,只是假設被明確檢查(例如,HAVE_LONGDOUBLE_FUNCS 隱含的所有函數將一起檢查)。

問題#

靜態 vs 非靜態?對於基本函數,我們應該將它們定義為靜態還是非靜態?

授權條款#

本文件已置於公共領域。

[1]: Autobook 在此