« プログラミング・情報教育研究会(その8) | トップページ | ウィキペディアとロングテール »

2007年9月27日 (木)

切り捨て・切り上げ

三重大学の奥村先生のblogに、「Excelが計算ミス」というスレッド(?)が上がっています。それを見て思い出した数年前の話があって、簡単な話なので、ここに書きます。


【問題】INT関数というのは小数部分を消去する「切り捨て(切り下げ)関数」ですが、では「小数部分を切り上げる関数」を簡単に作れ。

【解答・解説】Excel のマニュアルを引くと ROUNDUPが紹介されていますが、引数の個数(arity)が2で、ちょっと複雑に見えるんですよね。CELLINGは負の数にはうまく動かない。INTと同じようにできないかと考えてみると、うまく組み合わせるだけでできるということがわかりました。

y=INT(x)のグラフをxy平面に書いてみると、●−○ を使った階段関数になります。(●は端点含む、○は端点除く。)で、y=f(x)=切り上げ(x)は、○−● を使います。左右対象になっているところがポイントで、そこに注目すると

f(x)= -INT(-x)
とすればいいことがわかります。実際に、f(3.5)=-INT(-3.5)=-(-4)=4, f(5)=-INT(-5)=5 となります。で、これが簡単にできることなのに、検索しても意外にのってなかったりします。

こういうパズルは、プログラミングと似ていますが、ちょっとだけ違うのかなぁと思いました。

|

« プログラミング・情報教育研究会(その8) | トップページ | ウィキペディアとロングテール »

コメント

釈迦に説法かと思いますが,念のため指摘.

対象が負の実数になりうる場合は,そもそも「切り捨て」「切り上げ」という用語の解釈自体が不明確で,数学用語としての統一的確定的な定義がありません.すなわち,「-3.5の小数点以下を切り捨てた値」は,「切り捨て」という語の解釈によって-3でも-4でもあり得ます.
試験の出題時にはこのことは重大な問題となるので,しばしば,「切り捨て」「切り上げ」という用語の使用自体が忌避され,「xを超えない最大の整数」など,解釈が一意に定まる表現が使われます.

「切り捨て」=「INT関数の挙動」という解釈は,表計算やプログラミング言語に慣れた人々のセンスには合致するかもしれませんが,「切り捨て」という用語に対して広く認められた統一的解釈とはいえないでしょう.その意味で,INT関数を断りなく「切り捨て」と言い切るのは勇み足ではないでしょうか.

投稿: boiseweb | 2007年9月29日 (土) 23:21

>「切り捨て」=「INT関数の挙動」という解釈は,表計算やプログラミング言語に慣れた人々のセンスには合致するかもしれませんが

後者に反論。

プログラマ的にも、こういう自然言語の定義の曖昧さというのは度々問題になる部分ですよ。

切り捨てくらいならまだマシですが、有名所では「乗算に対する演算子オーバーロード」の問題があります。
整数や実数の乗算演算子を複素数に拡張するくらいなら特に問題なく実現できます。しかしベクトルの「かけ算」には外積と内積があり、一意に定義できません。「行列のかけ算」なら一応定義できますが、列と行の組み合わせによっては定義できず、この場合の処理に例外機構を使うか、暗黙の0拡張や単位行列拡張(と言うのか?)切り捨てを使うか、はみ出した要素を自動的に切り捨てるか、或いはその他のもっと別の方式を使うかには正解はありません。(個人的には演算子オーバーロードは使わず、問題発生時には例外送出が一番良いと思います。)

プログラマというのは、常にこういう定義の曖昧さと戦う仕事なのですよ。

投稿: とおりすがりのプログラマ | 2007年10月 3日 (水) 06:13

とおりすがりのプログラマさん:

なんか「反論」されてしまっていますが,私の考えはあなたと一致しているのですよ.
私は数学研究者です.また,情報科学教育やプログラミング教育にも関わっています.私自身も常に定義の曖昧さと戦っていますし,プログラマが定義の曖昧さと戦う仕事であることは知っています.
「表計算やプログラミング言語に慣れた人々」とは「処理系の組み込み関数をもっぱらユーザとして使う人々」を包括的に指したつもりです.「プログラミング言語に慣れた人々」の一部である職業プログラマをことさらに名指しする意図はありません.

私が前のコメントで言いたかったことは,次のことです.
========
INT関数を(ユーザとして)使い慣れた人の中には,(INT関数の厳密な定義を正しく知ったうえで,かつ)直感的に,INT関数の挙動を「『切り捨て』のひとつの一般化」として納得している人が少なくないだろう.
その理解は間違いではないし,無碍に否定すべきでもない.『切り捨て』の一般化に対するひとつの解釈として妥当性があるからだ.そして,その理解が個人の内心にとどまる限りはなんの問題もない.
しかし,その個人的理解をもとに,他者への意思伝達の場面で,INT関数の挙動を説明するために「切り捨て」という用語を使うことには問題がある.現状では「『切り捨て』の負の数への拡張方法」に統一的確定的な解釈がなく,曖昧さが生じるからである.
========

そのうえで,一般論として
========
処理系の設計者の立場では,仕様の策定や仕様の記述に際して,自然言語の定義の曖昧さを避けるために,ことさらに思慮深くなければならない.
========
という意見には100%賛成します.

投稿: boiseweb | 2007年10月 3日 (水) 11:08

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/140645/16591842

この記事へのトラックバック一覧です: 切り捨て・切り上げ:

« プログラミング・情報教育研究会(その8) | トップページ | ウィキペディアとロングテール »