夏も近づく八十八夜がすぐそこに迫っている。日中の気温は20度を超えることも珍しくなくなり,朝晩もコートが不要になった。ってことは,戦後日本初の十連休を過ぎた辺りでジメジメベトベトな毎日がやってくることになるわけで,それが終わると灼熱の日々が待っている。ハンコ押しをこなしているうちに夏になりそうな予感。

 今年1月に頼んだSIAMの本が,クレームを送ってようやく届いた。なんとなく,○○まで届いて消えちゃった感じがあるんだけど,真相は藪の中。届いていないモノは届いていないわけで,「とっとと届けて,届かないなら返金して」と催促したら返事があった後,最速便で三日で届いた。

G.Strang, “Linear Algebra and Learning from Data”, SIAM

 Strangの本って,理論も概説もコンパクトにまとまっているんだけど,ワシみたいなバカにはスンナリ染みこんでこないんだよなぁ。機械学習とDeep Learningの解説は参考にしつつ,ワシなりのモノにしていかないと。

 先週は予定通り学内教育プロジェクトの報告書がてらの紀要原稿を上げ,明日の新入生向けガイダンス(何度目だ)で使う資料を,前任者制作物に手を加えて仕上げて印刷し,6/9~11に開催されるIEEE国際研究集会に参加申し込みし($480!高ぇ),Python数値計算入門資料をちょろっと整えた。丸めモード変更手続きについてはイロイロ調べた結果,こういう風にすればよさげなことが分かった。

# 丸めモード変更
# [Windows&Linux] https://rafaelbarreto.wordpress.com/2009/03/30/controlling-fpu-rounding-modes-with-python/
# [macOS] https://stackoverflow.com/questions/16000574/tie-breaking-of-round-with-numpy

# OS種別
# https://stackoverflow.com/questions/1854/python-what-os-am-i-running-on
import platform

# 丸めモード定義
global FE_TOZERO, FE_DOWNWARD, FE_UPWARD, FE_TONEAREST
# set_rmode(丸めモード), 丸めモード = get_rmode()
global set_rmode, get_rmode

# DLL呼び出し
# from ctypes import cdll
from ctypes import *

# OS名
os_name = platform.system()

# Windows
if os_name == 'Windows':
 msvcrt = cdll.msvcrt
 MW_RC = 0x00000300
 set_rmode = lambda mode: msvcrt._controlfp_s(0, mode, MW_RC)
# get_rmode = lambda     : msvcrt._controlfp_s(pointer(current_mode), 0, 0)
 FE_TOZERO = 0x00000300
 FE_DOWNWARD = 0x00000100
 FE_UPWARD = 0x00000200
 FE_TONEAREST = 0x00000000
 def get_rmode():
  current_rmode = c_uint()
  msvcrt._controlfp_s(byref(current_rmode), 0, 0)
  
  return current_rmode.value & MW_RC
# Linux
elif os_name == 'Linux':
 from ctypes.util import find_library
 libm = cdll.LoadLibrary(find_library('m'))
 set_rmode, get_rmode = libm.fesetround, libm.fegetround
 # x86
 FE_TOZERO = 0xc00
 FE_DOWNWARD = 0x400
 FE_UPWARD = 0x800
 FE_TONEAREST = 0
# macOS
elif os_name == "Darwin":
 from ctypes.util import find_library
 libc = cdll.LoadLibrary(find_library('c'))
 set_rmode, get_rmode = libc.fesetround, libc.fegetround
 # x86
 FE_TOZERO = 0xc00
 FE_DOWNWARD = 0x400
 FE_UPWARD = 0x800
 FE_TONEAREST = 0

# 丸めモード確認
def print_rmode():
 rmode = get_rmode()

 if rmode == FE_TOZERO: print('切り捨て')
 elif rmode == FE_DOWNWARD: print('-Infへの丸め')
 elif rmode == FE_UPWARD: print('+Infへの丸め')
 elif rmode == FE_TONEAREST: print('最近偶数値丸め')
 else: print('不明 ', rmode)

 return rmode

# テスト
default_rmode = print_rmode()

# 切り捨て
set_rmode(FE_TOZERO)
print_rmode()

# 元に戻す
set_rmode(default_rmode)
print_rmode()

 さて,今週中に「Python数値計算入門(仮)」第2章を上げなければ。上げてGWはのんびりテキストのネタを構築するのだ。

T.Kouya

Share
Published by
T.Kouya