C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■19675  Re[2]: デレゲートでのNullReferenceException
□投稿者/ れれれ -(2008/05/27(Tue) 17:12:20)
    No19601 (Algol さん) に返信
    > 2008/05/26(Mon) 17:37:04 編集(投稿者)
    >
    > Invokeの使い方が間違ってる気が…
    > MSDNのサンプルを参考にもう一度確認した方が良いかと…
    >
    すいません。どこが違うかヒントだけでもいただけないでしょうか
    http://codezine.jp/a/article.aspx?aid=139#invoke
    を参考に構築してみたのですが・・・
    別の関数ではrichtextboxにdelegateを使って書き込むことはできているのですが。。。
    同じように書いて、pictureboxとlabelに書き込むことはできない。。。
    一つのプロジェクトの中に複数のデリゲートを作れないのでしょうか。
記事No.19598 のレス /過去ログ38より / 関連記事表示
削除チェック/

■22837  Re[4]: 日付表示とスラッシュ
□投稿者/ ABC# -(2008/08/03(Sun) 19:30:04)
    皆様,ご丁寧に,ありがとうございます。

    重ね重ね,感謝申し上げます。

    全て参考になりました。

    自分でも,これを前提に突っ込んで調べます。

記事No.22828 のレス / END /過去ログ43より / 関連記事表示
削除チェック/

■28522  Re[4]: バイナリコード内の16進数での文字列検索
□投稿者/ しょう -(2008/11/27(Thu) 13:16:42)
    No28518 (Jitta さん) に返信

    お返事有難うございます。
    > > 文字列なんてものはない。全て数値です。その数値に、人間が見て意味のある形を割り当てたところが「文字」。その文字が複数連続して現れるのが「文字列」。
    > > char の定義を見てください。0〜255(-128〜127)という数値でしょ?
    > このうち、0x20(32)〜0x7f(127) までが文字に割り当てられています(ASCII コードの場合)。C 言語の場合、この範囲の数値が複数個、0x00 が出てくるまで並んでいたら文字列です。他の言語では、文字数を表す数値と、実際の文字で文字列を表すものもあります。

    なるほど。
    今試してる方法は

    FILE *fp;
    char buf[BUFSIZ];

    fp = fopen("A.hoge","rb");

    while(fgets(buf,BUFSIZ,fp){
    cout << buf << endl;
    }

    といった感じで流れを調べているのですが、そもそもcoutじゃ文字列扱いだから駄目ということでしょうか?
記事No.28511 のレス /過去ログ52より / 関連記事表示
削除チェック/

■75940  decimal以上の小数部を扱うには?
□投稿者/ nobb -(2015/05/19(Tue) 18:19:27)

    分類:[C#] 

    現在とある計算ツールを作成しています。
    その中で、「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
    # この条件はお役所が決めたことですので変更できません。

    30桁も必要なんて思ってもいなかったのでdecimalで事足りると踏んでいましたが、これのおかげでdecimalも危うくなっています。

    C#においてdecimalの範囲以上の小数部の有効桁を実現するにはどの様な手段がありますでしょうか?
    自分で調べたところ http://www.tinyforest.gr.jp/mol/ こちらのライブラリの中にBigDecimalがあるので、
    それを使えば実現できるかと思いますが、再配布ライセンスが若干お高いのと、BigDecimal以外が多すぎてもったいないと思っています。

    何かいい手立てはありませんでしょうか?

    環境:Visual Studio 2013 Update4、.NET Framwork 4.5、C#
親記事 /過去ログ128より / 関連記事表示
削除チェック/

■75941  Re[1]: decimal以上の小数部を扱うには?
□投稿者/ 魔界の仮面弁士 -(2015/05/19(Tue) 19:27:15)
    2015/05/19(Tue) 21:18:27 編集(投稿者)

    No75940 (nobb さん) に返信
    >「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。

    10進数としての最大桁数は、Int64 で約18.9 桁、Decimal で約 28.8 桁ですので、
    標準的な型では厳しいでしょうね。
    かつての .NET 1.1 時代なら、J# の java.math.BigDecimal という逃げ道もありそうですが…。


    実装の手間を無視しても良いのなら、桁数に制限の無い System.Numerics.BigInteger 構造体を使って、
    計算処理は分数処理を実装、小数点表記への演算は「筆算」の要領で実装するとか。

    たとえば
      1/3 = 0.333333…
    の結果の桁数を 10 桁まで保証するために、
    あらかじめ分子を 「10000000000 倍した数」しておいて、整数除算で
      10000000000/3 = 03333333333
    と算出し、この結果を文字列加工して、1/10000000000 になる位置に
    小数点を打ち直せば、"0.3333333333" という結果が得られそうです。


    > BigDecimal以外が多すぎてもったいないと思っています。
    GitHub に、幾つかの実装が上がっていました。
    各ライセンスモデルは未確認な上、試してもいないのですが、一応参考までに。
    https://github.com/VoltDB/voltdb-client-csharp/blob/master/VoltDB.Data.Client/Types/ThirdParty.BigDecimal.cs
    https://github.com/SuprDewd/SharpBag/blob/master/SharpBag/Math/BigDecimal.cs
    https://gist.github.com/nberardi/2667136
    https://github.com/ckknight/ProjectEuler/blob/master/Ckknight.ProjectEuler/BigDecimal.cs
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75944  Re[2]: decimal以上の小数部を扱うには?
□投稿者/ nobb -(2015/05/20(Wed) 09:22:06)
    No75941 (魔界の仮面弁士 さん) に返信
    ご回答ありがとうございます。

    > 10進数としての最大桁数は、Int64 で約18.9 桁、Decimal で約 28.8 桁ですので、
    > 標準的な型では厳しいでしょうね。
    > かつての .NET 1.1 時代なら、J# の java.math.BigDecimal という逃げ道もありそうですが…。
    1.1は使えないので、そういう過去もあったのか・・・と歴史として覚えておきます


    > 実装の手間を無視しても良いのなら、桁数に制限の無い System.Numerics.BigInteger 構造体を使って、
    > 計算処理は分数処理を実装、小数点表記への演算は「筆算」の要領で実装するとか。
    >
    > たとえば
    >   1/3 = 0.333333…
    > の結果の桁数を 10 桁まで保証するために、
    > あらかじめ分子を 「10000000000 倍した数」しておいて、整数除算で
    >   10000000000/3 = 03333333333
    > と算出し、この結果を文字列加工して、1/10000000000 になる位置に
    > 小数点を打ち直せば、"0.3333333333" という結果が得られそうです。
    実装の手間は省けるものなら省きたいので知識として頭においておきます。



    > GitHub に、幾つかの実装が上がっていました。
    > 各ライセンスモデルは未確認な上、試してもいないのですが、一応参考までに。
    > https://github.com/VoltDB/voltdb-client-csharp/blob/master/VoltDB.Data.Client/Types/ThirdParty.BigDecimal.cs
    > https://github.com/SuprDewd/SharpBag/blob/master/SharpBag/Math/BigDecimal.cs
    > https://gist.github.com/nberardi/2667136
    > https://github.com/ckknight/ProjectEuler/blob/master/Ckknight.ProjectEuler/BigDecimal.cs
    URLの提示ありがとうございます。
    調べつつ適用できるか検討したいと思います。

    BigDecimalでぐぐってみてはいたんですが、GitHubまではたどり着けませんでした。
    後学のためにどのように検索したかお教えいただけませんか?
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75959  Re[3]: decimal以上の小数部を扱うには?
□投稿者/ 魔界の仮面弁士 -(2015/05/20(Wed) 15:09:12)
    No75944 (nobb さん) に返信
    > BigDecimalでぐぐってみてはいたんですが、GitHubまではたどり着けませんでした。
    > 後学のためにどのように検索したかお教えいただけませんか?

    今回は
     「BigDecimal C#」
     「BigDecimal CS」
    でしたね。
    GitHub の他、Google Code Search や SearchCode.com の結果が含まれるようです。


    > 整数部は1000未満(おそらく実際は200までいかない)の3ケタが必要で、
    > 小数部は30ケタが欲しいので有効桁としては33ケタになるのでしょうか。
    「固定小数点演算」が必要なのでしょうか。
    「浮動小数点演算」が必要なのでしょうか。

    固定小数点演算でよいのなら、各値の『小数点の位置』さえ揃えておけば、
    BigInteger 構造体で処置できるように思います。
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75961  Re[4]: decimal以上の小数部を扱うには?
□投稿者/ nobb -(2015/05/20(Wed) 15:43:48)
    No75959 (魔界の仮面弁士 さん) に返信
    ご回答ありがとうございます

    > 今回は
    >  「BigDecimal C#」
    >  「BigDecimal CS」
    > でしたね。
    > GitHub の他、Google Code Search や SearchCode.com の結果が含まれるようです。
    GitHubは表示されますが、その他の結果が出てこない・・・
    検索結果が最適化されているせいでしょうか。いづれにせよお教え頂きありがとうございます。

    > 「固定小数点演算」が必要なのでしょうか。
    > 「浮動小数点演算」が必要なのでしょうか。
    >
    > 固定小数点演算でよいのなら、各値の『小数点の位置』さえ揃えておけば、
    > BigInteger 構造体で処置できるように思います。
    自分で実装する時間が惜しいので今回は先にご紹介いただいた
    https://gist.github.com/nberardi/2667136/
    こちらを使って対応する方向で考えます。

    何度もご回答くださりありがとうございました。
記事No.75940 のレス / END /過去ログ128より / 関連記事表示
削除チェック/

■75943  Re[1]: decimal以上の小数部を扱うには?
□投稿者/ しま -(2015/05/20(Wed) 02:25:01)
    No75940 (nobb さん) に返信
    > 現在とある計算ツールを作成しています。
    > その中で、「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
    > # この条件はお役所が決めたことですので変更できません。
    > C#においてdecimalの範囲以上の小数部の有効桁を実現するにはどの様な手段がありますでしょうか?
    > 何かいい手立てはありませんでしょうか?
    > 環境:Visual Studio 2013 Update4、.NET Framwork 4.5、C#

    小数点以下30桁の意味するところがどこにあるのかがよく判りません。
    第一、とてつもなく大きい数と、とてつもなく小さい数とを足したり、引いたりすれば
    (1.0E29 - 1.0E-29 など)表現可能な桁数(仮数が) 60 桁以上なければ表現できないと思います。
    更に、分数の結果といっても、絶対値で 1 未満の数値になる保障はないので整数部の桁数も含めて
    有効桁数や、絶対値で最大の数値や絶対値で最小の数値をどこまで表現(又は保持)すべきなのかが
    明らかでないと適切な数値の表現形式は探せないように思いますが、間違っていますか。
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75945  Re[2]: decimal以上の小数部を扱うには?
□投稿者/ nobb -(2015/05/20(Wed) 09:34:20)
    No75943 (しま さん) に返信
    ご回答ありがとうございます。
    多少読みづらくなるかもしれませんが細かく返信させて頂きます。

    > 小数点以下30桁の意味するところがどこにあるのかがよく判りません。
    これは私も分かりません。そこまで小さい値で何をしたいのでしょうか・・
    しかし、そのような規程ですので対応できるのであれば対応せざるを得ないので泣く泣く質問させて頂きました。

    > 第一、とてつもなく大きい数と、とてつもなく小さい数とを足したり、引いたりすれば
    > (1.0E29 - 1.0E-29 など)表現可能な桁数(仮数が) 60 桁以上なければ表現できないと思います。
    これは私が無知でした。

    > 更に、分数の結果といっても、絶対値で 1 未満の数値になる保障はないので整数部の桁数も含めて
    > 有効桁数や、絶対値で最大の数値や絶対値で最小の数値をどこまで表現(又は保持)すべきなのかが
    > 明らかでないと適切な数値の表現形式は探せないように思いますが、間違っていますか。
    仰る通りです。大変失礼いたしました。
    とある2つの金額の分数という形になりますので、10倍以上の差は考えられない「だろう」と思っています。
    ですので、整数部は1000未満(おそらく実際は200までいかない)の3ケタが必要で、小数部は30ケタが欲しいので
    有効桁としては33ケタになるのでしょうか。計算も考えたら66ケタでしょうか・・・
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75953  Re[3]: decimal以上の小数部を扱うには?
□投稿者/ ピンフ -(2015/05/20(Wed) 12:29:47)
    > その中で、「分数の計算結果を小数点以下31桁目を切り捨て30桁止め」としなければならなくなってしまいました。
    > # この条件はお役所が決めたことですので変更できません。

    もし差し支えなければ、これが何の計算で、
    どの所轄官庁からの通達なのかを教えて頂けますでしょうか?
    もしかしたら、解決へのヒントが隠されているかも知れません。
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75955  Re[4]: decimal以上の小数部を扱うには?
□投稿者/ nobb -(2015/05/20(Wed) 14:11:15)
    No75953 (ピンフ さん) に返信
    ご返信ありがとうございます。

    > もし差し支えなければ、これが何の計算で、
    > どの所轄官庁からの通達なのかを教えて頂けますでしょうか?
    > もしかしたら、解決へのヒントが隠されているかも知れません。
    業務にダイレクトで引っ掛かるので直接的な事は言えないのですが、、、
    国土交通省から発表されるモノを受け県→市町村という形で下ってきます。
    その中で国・県に関しては小数点以下30桁で、というような記述はなくとある市町村が独自に制定した模様です。

    このような曖昧な表現でもよろしいでしょうか?
    (禁止されてはいませんが)あまり公な場で業務の内容を書くのに抵抗がありまして・・・
    # 個人的にお教えする手段があるのならお教えできますが・・・
記事No.75940 のレス /過去ログ128より / 関連記事表示
削除チェック/

■75972  Re[5]: decimal以上の小数部を扱うには?
□投稿者/ Jitta -(2015/05/20(Wed) 22:22:24)
    No75955 (nobb さん) に返信
    解決しているようですが。

    これ、「計算結果を表示する」だけでいいんじゃないの?
    計算結果を、もう一度次の演算に使うのかな?
    使わないなら、必要な時に計算して表示するようにすれば、30ケタだろうが40ケタだろうが、int(とstring)で十分ですよね。
記事No.75940 のレス / END /過去ログ128より / 関連記事表示
削除チェック/

■85971  Re[5]: 指数表記された文字列の数値変換方法について
□投稿者/ 魔界の仮面弁士 -(2017/12/06(Wed) 13:31:14)
    2017/12/06(Wed) 14:06:25 編集(投稿者)

    No85967 (たかじ さん) に返信
    > Deveel.Math.BigDecimalを初めて知ったので、
    BigDecimal の実装例は他にもあります(例: No75940 )が、
    その中でも、Deveel は有名どころかと思います。

    Microsoft 製ライブラリによる BigDecimal 実装が欲しければ、
     C:\Windows\assembly\GAC_32\vjslib\2.0.0.0__b03f5f7f11d50a3a\vjslib.dll
    という手もありますが、今回の要件には合わないですね。
    https://blogs.msdn.microsoft.com/dd_jpn/2007/06/26/visual


    > ・BigDecimalの演算はAdd、Subtract、Multiply、Divideのメソッドを使用しないとだめなのでしょうか?

    「x * y」と「y * x」では結果が変わりますよね?

    x * y の右値(y)が何であれ、左値(x)の『精度』が優先されるためです。
    これは乗算だけでなく、加算・減算・除算においても同じことです。

    そして、このクラスにとっての x * y というのは、
    x.Multiply(y, new MathContext(x.Precision)) の意味です。



    //using Deveel.Math:

    BigDecimal b1 = 300;         // 300×10^0
    BigDecimal b2 = 10000000 ;     // 10000000×10^0
    BigDecimal b3 = b1 * b2;      // 300×10^-7
    BigDecimal b4 = b2 * b1;      // 30000000×10^-2
    BigDecimal b5 = b1.Multiply(b2);  // 3000000000
    BigDecimal b6 = b1.Multiply(b2, new MathContext(b1.Precision));
    BigDecimal b7 = b1.Multiply(b2, MathContext.Unlimited);

    Console.WriteLine("{0}", b1); // 300
    Console.WriteLine("{0}", b2); // 10000000
    Console.WriteLine("{0}", b3); // 3.00E+9
    Console.WriteLine("{0}", b4); // 3.0000000E+9
    Console.WriteLine("{0}", b5); // 3000000000
    Console.WriteLine("{0}", b6); // 3.00E+9
    Console.WriteLine("{0}", b7); // 3000000000


    >  下記の結果だと、Subtractを使用すると指数表記無しで、*だと指数表記なのも気になります。

    指数表現を望まないのであれば、ToPlainString メソッドを使ってみてください。


    > ・指数表記の値をToXXで変換するとエラーが発生するのですが、回避策などありますでしょか?
    > Console.WriteLine("{0}", (decimal)b3); // 3000000000
    > Console.WriteLine("{0}", b3.ToDecimal()); // 例外が発生(Negative exponent)

    これについては、キャストで事足りるかとは思ったのですが、
    どうやら駄目そうですね。

    まぁ、もともとは『3.4E+38』を変換するのが目的だったので、
    そもそも decimal 化で良いのか、という懸念もありますが。


    で、実装を見る限りは Hongliang さんが書かれているように、
    単なる実装バグのようです。

    原因については、端折って書くと No85853 で述べた
    精度(あるいは有効桁数)の問題です。

    今回の場合、b3.UnscaledValue は 300 なので、
    仮数部だけ見れば、十分に decimal の範囲なのですが、
    b3.Scale が -3 なので、decimal の指数部に収まらなかったという。


    単に「3000000000」という数値を表すにしても、
     decimal x1 = new Decimal(300000, 0, 0, false, 0); // x1 = 300000M;
     decimal x2 = new Decimal(3000000, 0, 0, false, 1); // x2 = 300000.0M;
     decimal x3 = new Decimal(30000000, 0, 0, false, 2);// x2 = 300000.00M;
    とは書けても、
     decimal x4 = new Decimal(300, 0, 0, false, (byte)-3);
    とするわけにはいかないということで。

    # 実際には、「BigInteger.ValueOf(10L).Pow(-3)」によるエラー
記事No.85832 のレス /過去ログ147より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -