[#44431] コンストラクタの引数について&インスタンス変数の持ち方について — Akira Hayakawa <ruby@...>

度々オブジェクト指向についての質問ですいません。

17 messages 2008/01/04
[#44433] Re: コンストラクタの引数について&インスタンス変数の持ち方について — Yukihiro Matsumoto <matz@...> 2008/01/04

まつもと ゆきひろです

[#44469] pdf 作成 ライブラリ — "Luiz Aoki" <luizruby@...>

はじめまして、青木ルイスと申します、

14 messages 2008/01/12
[#44479] ファイル出力時のprintについて — m-hatake@... 2008/01/16

畠山と申します。

[#44483] format %g の丸めについて — 山崎雄介 <y-yamasaki@...>

山崎(ゆ)です。

14 messages 2008/01/16

[ruby-list:44494] Re: format %g の丸めについて

From: "GOTO Kentaro" <gotoken@...>
Date: 2008-01-16 16:58:37 UTC
List: ruby-list #44494
2008/1/16 山崎雄介 <y-yamasaki@saeilo.co.jp>:
> > 必ず指数表記にするなら %e で指定できます。
> たとえばこういうケースではGのようになって欲しいんですよね。。。
> format %.2E 8100 => 8.10E+003
> format %.2G 8100 => 8.1E+003
>
> Eでは少数部の桁数が固定になってしまうので、有効数字2桁のところが3桁に見えてしま
> います。

問題解決じゃないけど補足です。

それは、有効数字という術語の使い方が間違ってるようにも思います。
8100 の有効数字が何桁かはこの表記だけからではわかりませんが、
4桁であると解釈する向きもあるでしょう。

文書内で 8.1e+3 と書けば有効数字2桁であることがわかります。
しかしリテラル 8.1e+3 があらわす Float には有効数字2桁ということを
表明する方法はありません。つまり、与えられた Float のインスタンスが
もつ有効桁数を知る方法は存在しません。

いわゆる有効数字ではなく、ゼロ以外の最大桁というのは
用途にも依存したかなり複雑な概念なので組み込みの機能にはないでしょう。
アドホックな対応としては以下のようなものが考えられます。

class Numeric
  def nonzero_mantissa(n)
    sprintf("%.#{n}E", self).sub(/(\.[1-9]+)0+(e)/i){$1+$2}
  end
end

8100.nonzero_mantissa(2) #=> 8.1E+003


ごとけん

In This Thread