「std」を含む日記 RSS

はてなキーワード: stdとは

2017-09-05

https://anond.hatelabo.jp/20170904235845

一生に一回ぐらいヤってみませんか?

秘密厳守、絶対裸体を見ない、など必要な条件厳守の上でお相手いたしますよ。

ヒトパピローマウィルスやその他の STD感染していない証明書も提出いたします。

検討ください。

2016-05-13

awkを使って合計平均分散偏差を計算する

#!/usr/local/bin/awk -f

BEGIN{

   print "sum", "ave", "var", "std"

   sum=0;

   count=0;

   var=0;

}

{

 if(($1 !~ "#")&&($1 !~ "@")){

    sum+=$2

    var+=$2*$2

    count++

};

}

END{

   ave=sum/count;

   var/=count;

   var-=ave*ave;

   std=sqrt(var);

   print sum, ave, var, std;

}

2015-12-20

高速なビット行列乗算

前置き

この記事Competitive Programming (その2) Advent Calendar 201512月20日の分です.12月19日はhadroriさんの競技プログラマー入門者用単語集12月21日はroiti46さんです.

皆さんこんばんは.Mです.Advent Calendarを書くのは初めてなのでドキドキしていますが,どうぞよろしくおねがいします.普段あまり記事を書かないので anond を使わせてもらっています

ここでは,ちょっと役立つ小ネタとして,今年書いたコードを1つ紹介します.「ビット行列を高速に乗算するコード」です.ごく簡単なコードですが定数倍効率効果が大きいので嘘解法に使えます

ビット行列

要素がブール値(True/False)であるような行列ビット行列と呼ぶことにします.このような行列に対する演算特に乗算)はアルゴリズム理論ではよく出てきます.最も有名な例はグラフの推移包閉(各点から行ける点を全部求める)です;行列 A をグラフの隣接行列とし,和をbit-or, 積をbit-and で定義すると,行列のべき乗和「A^0 + A^1 + ... + A^{n-1}」の (i,j) 要素が True であることと,j から i に到達可能であることが同値になります.なお,このべき乗和は (I + A)^{n-1} と等しいので,高速べき乗で一発で求めることが可能です.グラフの推移包閉を求める現在理論的に)最速の手法はこのアプローチに基づいており,計算量 O(n^\omega / log n) を達成します.O(n^\omega) は行列乗算の計算量で,現時点では \omega = 2.3728639... が最良です(Francois 2014).また,log n は Method of Four Russians と呼ばれるビット演算高速化する一般的テクニックで,サイズ log n までの演算結果を全部ハッシュに突っ込んでおくものです.

さて,この Method of Four Russian というテクニックは,実際に実装してもあまり早くないことが知られていますテーブル引きが遅い・単純なループが早い).ただし「いくつかのビットブロック単位計算する」というアイデア実用的にも有用です.ブロック単位演算ビット演算実装できるとき,そのアルゴリズムは「ビットパラレルアルゴリズム」と呼ばれています編集距離などの例が有名です.

ここでは,ビット行列に対するビットパラレル行列乗算を実装してみました.

コード&実測結果

A^n を計算するプログラムを書きました.実測結果を以下に示します.MacBook Pro; 2.8GHz Intel Core i7; 16GB 1600 MHz DDR3; g++ -std=c++11 -O3.実装http://ideone.com/8AsuI2 にあります

n提案手法[s]通常手法[s]
160.0000140.000082
320.0000250.000602
640.0000740.004485
1280.0004400.036760
2560.0027570.311192
5120.0201632.847787
10240.20055624.648609
20481.567657205.503351
409613.894987---
8196124.414617---

それなりに大きな n について 120倍くらい高速化しました.これだけ差があると嘘解法が通るようになります

解説

ビット行列を 8×8 のブロックに分割し,それぞれを unsigned long long (64bit) 1つで保存します.64が平方数というのが美しいですね.全体の乗算は8×8ブロックの乗算を普通に行えばよいので,結局 unsigned long longで表現された2つの8×8行列の積を考えれば十分です.

ここでは8×8行列の積を外積形式実装します.外積形式というのは C = A B という積を C = (Aの1列目×Bの1行目) + ... + (Aのn列目×Bのn行目) という外積の和の形で表現するものです.各外積は,すべての列がAのk列目と等しい8×8行列とすべての行がBのk行目と等しい8×8行列bit andに等しいので,Aからすべての列がAのk列目と等しい行列を作る方法とBからすべての行がBのk行目に等しい行列を作る方法を考えれば十分ですが,これはビットマスクして定数乗算すれば実装できます

余談

このコードとある問題に対する嘘解法用に作成したものですが,結局普通のほうでも通るようになってしまったので,オフィシャルにお披露目する機会がありませんでした.

2015-07-25

不定方程式の解を求めるためのC++のコード(2chプログラマ板の片山氏の作成

// Copyright (C) 2015 Katayama Hirofumi MZ. All Rights Reserved.

2.//

3.// http://p...content-available-to-author-only...h.net/test/read.cgi/tech/1437736018/

4.//

5.// 式 1/2^(a1) + 1/2^(a2) + … + 1/2^(an) = 1

6.// を満たす非負整数a1~an(ただしa1≦a2≦・・・≦an)を求める

7.// プログラムBASICで作りたい。nを適当指定できるようにして

8.// すべての解を出力するプログラムを書け。

9.#include <iostream>

10.#include <set>

11.#include <map>

12.using namespace std;

13.

14.int n;

15.set<map<int, int> > solutions;

16.

17.void print(const map<int, int>& m) {

18. for (auto& pair : m) {

19. for (int i = 0; i < pair.second; ++i) {

20. cout << pair.first << " ";

21. }

22. }

23. cout << endl;

24.}

25.

26.int total_count(const map<int, int>& m) {

27. int c = 0;

28. for (auto& pair : m) {

29. c += pair.second;

30. }

31. return c;

32.}

33.

34.void do_it(const map<int, int>& m) {

35. if (total_count(m) == n) {

36. solutions.emplace(m);

37. return;

38. }

39. for (auto& pair : m) {

40. if (pair.second > 0) {

41. auto m2 = m;

42. m2[pair.first] -= 1;

43. m2[pair.first + 1] += 2;

44. do_it(m2);

45. }

46. }

47.}

48.

49.int main(void) {

50. cout << "n: ";

51. cin >> n;

52.

53. map<int, int> m;

54. m.emplace(0, 1);

55. do_it(m);

56.

57.

58. cout << "solutions: " << endl;

59. for (auto& ans : solutions) {

60. print(ans);

61. }

62.

63. return 0;

64.}

2014-04-09

http://anond.hatelabo.jp/20140409111309

c++std::stringが+オペレータ文字列結合に割り当ててしまったゆえに生まれた悲劇

おかげで統一された文字列結合演算子が無くて、+とか.とか&とか||とか様々な記号

その目的に使われるという嬉しくない状況になってしまっている。

2012-07-05

http://anond.hatelabo.jp/20120705023743

自己評価自分でも高いかいかよく分からない。

問題を他人に押し付けられる感じが嫌なんだよね。

まったりと、自分の好きな課題だけに取り組んでいきたい。そういう風にして生きている。

プログラミングも同じで、自分の作りたいものだけを作って生きている。

それともう一つ不満なのは(或いは『自分に合ってない』と表現した方が適切なのかも知れない)、洗練されたデータ構造設計必要性が問題中に殆ど出現しない所。

これは多くの言語に対して同じ問題を提供するには仕方のない事かも知れない。でも個人的にはそれが不自由で仕方がなかった。

例えばC++における純粋仮想関数インターフェイス)と継承を使った下記の様な「木」を表現した構造、まず出てこないでしょ?C++ではなくCならswitchテーブルを使った再帰関数で実現する必要があるし、これが言語間で共通な問題を隔てる原因にもなっている。

struct interface_tree{
    virtual double eval() const = 0;
    virtual std::size_t subtree_num() const = 0;
    virtual interface_tree *subtree(std::size_t) = 0;
    virtual ~interface_tree(){}
};

// expression tree, add
struct tree_add : public interface_tree{
    tree_add(std::size_t n, interface_tree **t){ subtree_[0] = t[0], subtree[1] = t[1]; }
    virtual double eval(){ return subtree(0)->eval() + subtree(1)->eval(); }
    virtual std::size_t subtree_num() const{ return 2; }
    virtual interface_tree *subtree(std::size_t i){ return subtree_[i]; }
    virtual ~tree_add(){ delete subtree_[0]; delete subtree_[1]; }
    interface_tree *subtree_[2];
};

// expression tree, sub
struct tree_sub : public interface_tree{
    tree_add(std::size_t n, interface_tree **t){ subtree_[0] = t[0], subtree[1] = t[1]; }
    virtual double eval(){ return subtree(0)->eval() - subtree(1)->eval(); }
    virtual std::size_t subtree_num() const{ return 2; }
    virtual interface_tree *subtree(std::size_t i){ return subtree_[i]; }
    virtual ~tree_add(){ delete subtree_[0]; delete subtree_[1]; }
    interface_tree *subtree_[2];
};

// expression tree, value
struct tree_val : public interface_tree{
    tree_val(double n_) : n(n_){}
    virtual double eval(){ return n; }
    virtual std::size_t subtree_num() const{ return 0; }
    virtual interface_tree *subtree(std::size_t i){ assert(0); }
    virtual ~tree_add(){}
    double n;
};

// ...

2012-06-15

http://anond.hatelabo.jp/20120615111615

スマートポインタは、ここで言われている アドレスの参照指定としてのポインタじゃないよ。単なるコンテナ名前ポインタってついてるからといって、いわゆるポインタじゃない。分類的にはコンテナ

 

const char *str = "hogehoge";

std::string str = "hogehoge";

std::tr1::smart_ptr<std::vectorchar> > hako(new std::vectorchar>);

の3種類があった時に string型も ポインタを代入しているが、 ポインタとは呼ばないだろ。コンテナと呼ぶ。

記法上 new を呼び出すが、 それが嫌なら、そういうコンストラクタ書いてもいいしな。

 

const char*なら

str++ とか str-- str+n という記法アドレス参照 ができるが

スマートポインタは そういう使い方はしない。 あくまでも指定されたオブジェクト管理するだけ。

たいていの使い方をする場合に、参照カウンタの増減なんて手動ではしないから。(というか、ポインタがわからない奴がするな コピコン使え という設計方針でいいとおもう)

そして、マーク&スイープはガベコレの技法からまして、自動でやるもので、たいていのプログラマーに書かせるものじゃない。

2011-12-20

風俗を使うことをここで開き直っている男の悪しき所は、

交際してる本命パートナー風俗通いを隠しているところ。

後ろめたくないんだったら彼女に言えばいい。

プロテクで心地よく射精させてもらうのが、美容院へ行くのと同じ「正当なサービスの消費」なんだったら、彼女に言えばいいよね?

なぜ隠れて行くのかわからない。もし後ろめたいなら、それは正当じゃないってことだ。

 

正直に言ってくれれば、風俗漬けの男とは別れようとか、検査に行こうとか、この人と粘膜接触は控えようとか、

ヤったあとは石鹸で洗おうとか、はたまた私も出張ホストと寝ようとか、色々行動のしようがある。

でも隠されたらどうしようもない。

「元彼の元カノの元彼の元カノの・・」っていうSTD注意喚起のCMがあったが、それと同じ。

彼氏風俗嬢とその客を通して間接的に数十人数百人とつながりをもつことになってしまう。それも知らないうちに。

配偶者に隠れて風俗通いされる女は完全に被害者だ。

知らないうちに子宮頸がん不妊危険にさらされる。

2011-12-16

http://anond.hatelabo.jp/20111216151256

結論:売春に関わる人間は総じてクズ

 

まともな女の子は幼いうちから知識をつけて自衛しましょう。

まともな親は学校性教育に頼らず気恥ずかしくても自分たちで子供STD教育しましょう。

http://anond.hatelabo.jp/20111216150329

STDの知識を中学生から義務教育でしっかり教えることで女の子の知識が底上げされると性風俗産業に就く子が減っちゃうし

そうなると可愛い子が入ってくる数も減っちゃう。

しか子供に影響与えることがわかると世の奥様方も段違いに旦那管理にピリピリしだしちゃって

男も生きづらくなるんだと思うの。

風俗店やくざさんが運営してるものだけど、可愛い女の子業界に来にくくなったり、客が減ったりするようなことは、

なんとしても、多方面に圧力をかけてでも、避けようとするんだろうと思うの。

やくざは人の子供が性病感染した状態で生まれようがお金がもうかれば関係ないし、

男は自分の子供が性病感染した状態で生まれようが風俗で若い子のつまみぐいをできなくなることの方が嫌なんだろうと思うの。

そして結婚しないとか離婚するっていう選択は、お金がないときにタダセックスできないからそれも嫌なんだと思うの。

http://anond.hatelabo.jp/20111216145647

本当にシャレにならん。

学校教育STDを教えるならこういうことまで踏み込まなきゃいけないんじゃないか

STDは 自分の体なんだから俺の勝手だろ?で済むレベルにとどまらず、愛する妻子を傷つけるリスクがあるってことを教えないと。

母体から赤子に移る母子感染のことは習った記憶があるけど、

風俗でもらって嫁に移すとか、妻がいくら治してもまた夫が風俗でもらってくるピンポン感染とか、そういうより卑近で具体的な例は教えてくれなかったように思う。

http://anond.hatelabo.jp/20111216123419

日本データは元々なんのための調査のデータかっていうとSTD感染実態のための調査だから、粘膜接触を伴う性交渉が調査対象とされている。

からヘルスも込み。

2011-11-06

http://anond.hatelabo.jp/20111105190237

感染率について、仮にキャリアだったとしてもまず0.01%以下です。傷がある場合は一桁以上あがりますが。

全部あがってきているとは限りませんが異性間の接触での感染者は年間200件にも満たないのです

ましてオーラル程度では感染率はさらに低いです。おちつきましょう。

http://oshiete.goo.ne.jp/qa/6034345.html?check_ok=1

また、日本AIDS自体のキャリアである確率は高いとはいえません、これは一般論にすぎませんが。

ただしほかのSTDキャリアである確率はかなり高いと思いますクラミジアで30%という報告もありますし、風俗の半分近くは何らかの感染症をもっていると考えても過言ではないでしょう。

特に素股を拒まれたというのであればなおさらです。いずれにしてもゴム最初からつけましょう。

3週間、ひどくても一ケ月程度もすれば自然治癒するものは治るはずで、治療しないとひどくなるSTDも多くありますので、内科性感染症全般の検査をお願いすることをお勧めします。

検査費用は自費なのでかかるでしょうがやむをえないでしょう。

2011-10-15

円光(買った男より)

たぶん円光歴もかれこれ10年くらい?

今まではそんなに頻繁にやっていたわけではないが、相手に支払った額やホテル代、出会い系サイトの利用料含めればざっと100万はくだらないのではないか

その金があったらもっと有意義なことに使えただろう。

でも、性欲が高まってるときは冷静な判断できない。

支出収入を超えてるわけじゃないし」「貯金が○○円切るまではパーッと使っちゃおう」みたいな思考に囚われてしまう。

ちなみに風俗には数えるほどしか行ったことがない。価格時間制限のバランスがちょっと割高に感じるのが主な理由だ。

 

最初は会うだけでかなり緊張してた。美人局の可能性も考え恐怖もあった。会えたら普通に飯食ったりするだけで、飲食代・カラオケ代+ちょっとしたお小遣い代だけ払ってた。

業者の釣りや冷やかしに会ったことも最初の頃は多かった。

性的なのも、最初は5000円~1万くらいで、おっぱいやお尻触らせてもらったり、手や口でしてもらったりというソフトな注文ばかりだった。いわゆるプチ。本番に対しては何か恐れを抱いていた。そもそもの女性経験ほとんどなかったし、稼ぎも少なかったことも理由だ。

それでも最初はかなり背徳感があった。しかし、それだけに興奮度も高かった。プチの場所がカラオケネカフェだったこともスリルを加速した。

初めて円光で本番したのは誰が相手だっただろうか?思い出せない。ジェームス三木みたいに日記つけとくんだったな。しかし、本番やったときに一線越えたな、という感じはあった。

この頃から(たぶん2005、6年ごろ?)、売り手の方でもどうせ円光するなら単価が高い方がいいからか、プチ希望はぐっと減って本番のみ希望者が圧倒的になったようだ。本気で金が必要な人も増えたせいか、売り手の年齢層が上がった気もする。サイト運営者の工夫もあるのか業者や冷やかしはほとんどいなくなった。純粋に相手の条件とこちらの条件が合うかどうかだけがポイントになったようだ。

 

相手の容姿は、意外と美人の方がプロフ写メを出してたり、リクエストしたら送ってくれる傾向があるような気がする。見られたい願望があるタイプもいるんだろう。あと金欠で切羽詰りすぎてる人もわりと写メくれる。しかし、一般的に警戒して写メを出さないのが多数派か。だから当たり外れは現地に行って初めてわかる。あまりにも好みとかけ離れてたら(ありていにいえばブス)ブッチすることもあったが、そうでなければ据え膳食わぬは何とやらで…。確率的にはかなりの美人にあたることもある(メイクした上での話しだが)。おおむね好みと言えるのは会った中の2割くらいか

 

JK16、JC14と本番したことがあり、JC15とプチしたことがある。それまではやりたく仕方なかったJKJCだが、ある時、円光で逮捕の記事を読んでから急に怖くなり、警察逮捕される可能性を考えると眠れないこともあった。朝、自宅のインターフォンが鳴らされた時は心臓が縮みあがる思いだった。家族職場逮捕が知られたら…と思うと自殺も考えたこともある。おかげさまで(?)無事時効を迎えました。しかし、そもそも出会い系サイトではJKJCなんてまずいないような気がする。一部報道ではグリーモバゲーに流れてるらしいが、それは男が声かけてるんじゃなくて、JKJCの方から募集してるんだろうか?何にしても俺はもう追いかけたりしない。

 

生や中出しもやったことがある。中出しOKの子はもちろんピルを飲んでるんだが、生外の子はわからない。外に出せば大丈夫だと思ってるのだろうか。そして、当の自分性病が怖くなってやった3ヶ月後に保健所HIVSTD検査に行くのであった。今のところはセーフ。いい加減学習しろよと自分でも思うが、やはり性欲の衝動に勝てないのだ。

ちなみに今日は生でアナルに入れてみた。相手も了承済みの上でお互い初アナルだったが、少し痛がったのでピストンはしなかった。そして来年1月にはまた保健所に行くんだろうな、俺。

 

これまでは数ヶ月に一度の性欲の高まりに応じて、サイトで相手を探すという感じだったのだが、今年に入ってからはペースが上がってきた。月に二度、三度という時もある。貯金が目に見えて減って行ってる。

ひょっとすればセックス依存症何かの病気なのかもしれない。いくらなんでも性衝動太刀打ちできなさすぎる。円光以外にも様々な悪さをしているし。このまま人生が破滅するまで続くのだろうか。

2011-05-15

http://anond.hatelabo.jp/20110515101054

C++言語

fooのintへのキャストがtrue/falseを返すというように、fooのクラス仕様が決められてるんなら、

そしてboolへのキャストが未定義だったり、また違う意味なのなら

    if (foo) {

はな

    if (foo == true) {

って書かざるをえないだろう。嫌いとか好きとかの問題ではないと思う。

class {
public:
    operator bool() { std::cout << "xxx\n"; return true; } //*1
    operator int() { std::cout << "yyy\n"; return true; } //*2
} foo;

があったときに、「if (!foo)」だったら*1が、「if (foo == false)」だったら*2が実行されるような処理系がある。

最新のVC++だと後者曖昧だってエラー出るね(たぶんC++だと「trueは1でfalseは0」なんかではなくあくまでもtrueとfalseなんだ)。

なんにせよ演算子や条件式などに関連する暗黙のキャストはわかりづらく、そしてそんなのを利用したコードはきっとバグる。

から

(fooはいろんなオブジェクトだと思ってほしい

というのが本当なら、==trueがどうこうなんて些細な問題はおいておいて、fooを暗黙のうちにintにキャストしたりboolにキャストしたりして使っているという危険部分をまずなんとかすべきだろう。

VCとかVBとかじゃなくてC言語仕様の話だろ

古いC言語風に書けばこんな感じ。

#define FALSE 0
#define TRUE (!FALSE)

かに、実際に値を表示させてみると、昔のVC6だと「1」という結果が出てくるし、VB6だと「-1」という結果が出てくる。これ、当時混乱の元だったんだよね。


aとbが等しいときに、

C言語だと、(a==b)の評価結果が1になるけど、

BASICだと(a=b)の評価結果は-1になる。

VC6とか関係なくてC言語仕様でそうなんだが、それをわかってないとすればやばい

個人的な好き嫌い

個人的には

   if( foo != FALSE ){

も十分きもちわるいので

   if (foo) { ... }
   if (!foo) { ... }

にしてほしい

2011-01-14

http://anond.hatelabo.jp/20110114214708

もちろん

if(!i%15){
  std::cout << "fizzbuzz" << std::endl;
}else if(!i%5){
  std::cout << "buzz" << std::endl;
}else if(!i%3){
  std::cout << "fizz" << std::endl;
}else{
  std::cout << i << std::endl;
}

とか書くことはできますが、見やすさとかそういう話はいいかと思って短くしてみました

あと3項演算子の:の左右で違う型を受け付けてくれないので、intを文字列に変換する必要がありました

sprintfを使わないで変換する方法がわからなかったもので。

「ヤバい」と書かれた方でしょうか?

http://anond.hatelabo.jp/20110114202812

void fizzbuzz(int n)
{
  for(int i=1;i<=n;i++){
    char ich[sizeof(int)];
    sprintf(ich,"%d",i);
    std::cout << ((i%15==0)?"fizzbuzz":((i%5==0)?"buzz":((i%3==0)?"fizz":ich))) << std::endl;
  }
}

コードとかほんと苦手。

2011-01-09

http://anond.hatelabo.jp/20110109000805

最近は、24インチ 30インチディスプレイなんて安いんだから、横80ではなく横120ぐらいは平気で使える。

classname::enumname という毎回指定でも エディタインテリジェントに保管してくれるから問題ない。

個人的には、毎回、スコープを明示して欲しい

 

基本的に 外部ツールがチェックしてくれるんだから

class{

enum{

{

};

で問題ないと思われ

言い方を変えれば、class内部以外でenum定義することなんて最近はあるのか?グローバルなenumなんて余り無いと思うが・・・

クラス内部では、省略できるし、外部からクラス内部の値を呼ぶときは、どのクラスのこのenumって外部だよって意味で毎回書いたほうが安全だろ?

 

スコープの省略は基本、オススメできない。

using namespace std

ですら、書かないほうが安全 毎回std::って書かないと、うっかり、stringクラス定義する人がいないとは限らんからね・・・

一斉に変更したい? エディタ正規表現で置換すればよろしい・・・

 

原則、外部のツールで解決できる問題は、外部のツールで解決すればいい。

言語仕様拡張されると、初心者に、その理屈を説明するという問題が出てきて、そういうのは初心者には無理。

他方、ツールを使えない初心者でも、毎回コピペや手で置換は出来る。

 

ソーシャルな人を使うという観点から、そういう言語拡張オススメできない。

2010-07-28

std::copy(v.begin(), v.end(), std::ostream_iterator<string>(std::cout, "\n"));

とか書くやつなんなの

2010-07-20

http://anond.hatelabo.jp/20100720121747

指摘ありがとう。以前に見かけた資料を再確認したらHIVに限った話じゃなくてSTD全体の話だった。

元にした資料はこれ。

http://www.acc.go.jp/kenkyu/ekigaku/2000ekigaku/eki_016/016.htm

STD患者パートナータイプ

 女性男性
決まった相手のみ59.417.3
不定期の相手のみ3.113
定期・不定期両方25.043.5
不明12.526.1

感染危険があってもなんで生でやるのかっていう話に対するツッコミのつもりだったので、趣旨としては多分あんまずれないと思うけど、表記として正確じゃないので撤回します。

http://anond.hatelabo.jp/20100720113018

横だけど。

コンドームを配って使い方教えてやっても生でやるんだ

HIV蔓延してる土地

救い難いね

日本先進国の中では新規感染率が増えているやばい国なんだよね。

でも、子供ができたら結婚するつもりのカップルとかだったら、生でやるのは珍しくないんじゃないのかな。


日本では、HIVの新規感染STD感染率は男女差あまりないけれど、感染者の性行動の内訳としては男性不特定多数と1年以内に性交渉を持っている人がメインだけど女性場合は1年以内に特定の1人としか性交渉を持っていない人がメインらしい。

そういうわけで、少なくとも女性に対しては、特定の相手とだけ性交渉をしていれば感染リスクは少ないという啓蒙意味がないということが分かって、啓蒙内容を検討しなければならないという見解になっているそうだ。

日本男性風俗利用について寛容であることが比較的求められてるけど、風俗に行くような男性と生でやることが一番リスクが高いことなんだっていう啓蒙がもっとなされないとやばいよね。

2010-05-10

多倍長ライブラリMPIRで複素数std::complexを扱う方法(C++)

C++プログラムで多倍長な複素数を使いたかったのでメモ

C++において多倍長整数,多倍長浮動小数点を扱うライブラリとしてGMPが有名だ.

Visual C++を使っているのなら,GMPと互換のあるMPIRが導入しやすくて良い.

以下,VC10 (Visual Studio 2010)環境での話.

このMPIRはどうもC++複素数クラスstd::complexと相性が悪いようだ.

以下のコードエラーとなってしまう.

#include <complex&gt; 
#include <iostream&gt; 
#include <iomanip&gt; 
#include <mpirxx.h&gt; 

int main()
{
	std::complex<mpf_class&gt; a(1.0, 2.0);
	std::complex<mpf_class&gt; b(0.0, 1.0);
	std::complex<mpf_class&gt; c1 = a + b;
	std::complex<mpf_class&gt; c2 = a - b;
	std::complex<mpf_class&gt; c3 = a * b;
//	std::complex<mpf_class&gt; c4 = a / b;	// error
	
	std::cout << "a  =" << a  << std::endl
	          << "b  =" << b  << std::endl
	          << "c1 =" << c1 << std::endl
	          << "c2 =" << c2 << std::endl
	          << "c3 =" << c3 << std::endl;
//	std::cout << "c4 =" << c4 << std::endl;
	return 0;
}

「operator/=」から呼び出される「_Div」内部でエラーが出る.

そこでテンプレートの特殊化をする.

#pragma once
#include <mpirxx.h&gt;
#if defined(_MSC_VER) &amp;amp;&amp;amp; (_MSC_VER == 1500)      /* VC9 (Visual Studio 2008) */
  #pragma comment(lib, "C:\\lib\\MPIR\\vc9\\mpirxx.lib")
  #pragma comment(lib, "C:\\lib\\MPIR\\vc9\\mpir.lib")
#else if defined(_MSC_VER) &amp;amp;&amp;amp; (_MSC_VER == 1600) /* VC10 (Visual Studio 2010) */
  #pragma comment(lib, "C:\\lib\\MPIR\\vc10\\mpirxx.lib")
  #pragma comment(lib, "C:\\lib\\MPIR\\vc10\\mpir.lib")
#endif

#include<complex&gt;
namespace std {
	template<&gt;
	complex<mpf_class&gt;&amp;amp; complex<mpf_class&gt;::operator/=(const complex<mpf_class&gt;&amp;amp; _Right)
	{	// divide by other complex   //this-&gt;_Div(_Right);
		mpf_class _Rightreal = (mpf_class)_Right.real();
		mpf_class _Rightimag = (mpf_class)_Right.imag();

		mpf_class bunbo = _Rightreal * _Rightreal + _Rightimag * _Rightimag;
		mpf_class re = ( this-&gt;real() * _Rightreal + this-&gt;imag() * _Rightimag ) / bunbo;
		mpf_class im = ( this-&gt;imag() * _Rightreal - this-&gt;real() * _Rightimag ) / bunbo;

		this-&gt;real(re);
		this-&gt;imag(im);
		return (*this);
	}
}

これでとりあえずは割り算もできるようになった.

計算精度については何も考えていない.

突っ込みお待ちしてます.

 
アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん