トップページ⇒tech
80コメント34KB

☆C/C++☆ちょっと役立つプログラム作らない?

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2005/07/10(日) 14:46:40
OS問わず、C/C++でちょっと役立つプログラムの提案と作成をしませんか?
0002デフォルトの名無しさん2005/07/10(日) 15:21:53
>>1
モノにもよるんだが、概ねshとかvbsで何とかならないか?

と俺は思うわけだが。
0003デフォルトの名無しさん2005/07/10(日) 17:42:55
>>1
> ちょっと役立つプログラム
ってlintみたいなの?
それとも関数とかライブラリのこと?
000412005/07/10(日) 18:56:16
ライブラリも含めてなんでも。
例えばC/C++でCGIやるためのライブラリ作るとか、SQLへのアクセスを簡単にする
クラス作るとか。
0005デフォルトの名無しさん2005/07/10(日) 19:14:25
こういうスレもあるのだが
【フリー】こういうソフトを作って下さい リク2
http://pc8.2ch.net/test/read.cgi/tech/1120404369/

C/C++のみでいくということか
000612005/07/10(日) 21:01:14
C/C++で作ればソースによるけど一番高速なのができると思う。
まぁホントの最速はアセンブラだけど実用的なのはちょっとつくれないし。
0007デフォルトの名無しさん2005/07/10(日) 21:05:25
アセンブラ最強説は、パイプライン処理によって脆くも崩れ去りました。
000812005/07/10(日) 21:15:02
>>7
ソースによるのでは?
ともかく、何をつくるかだけどCGI用のライブラリはどうでしょう?
0009デフォルトの名無しさん2005/07/10(日) 21:38:44
#include <stdlib.h>
#include <math.h>
typedef unsigned int uint_t;
/*@function 素数リスト生成)
  @param [in]  max : max 未満の素数リストを生成。
  @param [out] size : 生成された素数の数。不要ならNULLを指定。
  @return 素数リスト(uint配列先頭アドレス)。0ターミネイト。異常時NULL。
  @note ヒープからメモリを割り当てるので呼び出し側で開放すること。
 */
uint *create_prime_list(const uint max, size_t *size)
{
  uint_t *buf = NULL;
  if(size != NULL) *size = 0;
  if( max == 0 ) return NULL;
  if(NULL != ( buf = calloc(1,sizeof(uint_t)*max)))
  {
    uint_t i,j;
    for(i = 2; i < sqrt(max); ++i)
    {
      if( buf[i] ) continue;
      for(j = i+i; j < max; j += i) buf[j] = 1;
    }
    for(i = 2, j = 0; i < max; ++i)
      if( !buf[i] ) buf[j++] = i;
    buf[j] = 0;
    if((NULL != (buf = realloc(buf, sizeof(uint)*(j+1)))))
      if(size != NULL) *size = j;
  }
  return buf;
}
0010デフォルトの名無しさん2005/07/11(月) 01:25:21
>>7
誰かこれを詳しく説明してくれ。
0011デフォルトの名無しさん2005/07/11(月) 18:19:00
ちょっと役立つ、ぐらいならスクリプト系かインタプリタ系の言語の方がいいと思うが。
0012デフォルトの名無しさん2005/07/11(月) 18:23:50
Perlでいう splitの関数ってよく見るんだけど
結局みんな自分で作ってるね
ここで作らない?


0013デフォルトの名無しさん2005/07/11(月) 18:24:34
関数とかを作ればいいのでは?
001412005/07/11(月) 21:58:34
>>12
いいですね。
手始めはそんなところで
0015デフォルトの名無しさん2005/07/12(火) 12:15:10
先ずはそのsplitの仕様を教えてくれ。
0016デフォルトの名無しさん2005/07/12(火) 16:10:52
そうだなみんなでやるとは言え
まず>>1が口火を切って欲しい
001712005/07/12(火) 16:17:11
了解、でも只今期末試験中なので少し時間かかるかも。
001812005/07/12(火) 21:55:07
少し根性出してみた
#include <stdlib.h>

char **split(char cutter, char* string);

int main(void)
{
char string[256];
char** strings;
int i;

printf("Enter a string including '@':");
scanf("%s",string);

strings = split('@',string);

for(i=0;strings[i] != '\0';i++)
{
printf("%s\n",strings[i]);
}
}
001912005/07/12(火) 21:55:53
char **split(char cutter, char* string)
{
int i,j,k,n=0;
char** strings;


for(i=0;string[i] != '\0';i++)
{
if(string[i] == cutter)n++;
}
n+=2;

strings = (char **)malloc( n * sizeof(char *) );
002012005/07/12(火) 21:56:22
for(i = 0, j = 0, n = 0;i <= strlen(string); i++)
{
if(cutter == string[i] || string[i]=='\0')
{
*(strings + n) = (char *)malloc( (i-j+1) * sizeof(char *) );
for(k = 0; k < i-j; k++)
{
strings[n][k] = string[j+k];
}
strings[n][k+1] = '\0';

j = ++i;
n++;
}
}

*(strings + n + 1) = (char *)malloc(sizeof(char *));
strings[n+1][0] = '\0';

return strings;
}
002112005/07/12(火) 21:57:34
使ってみてください。
あと、なんかまずいとことか指摘してほすぃ。
002212005/07/12(火) 21:58:56
あ、一番うえ、#include <stdio.h>抜けてる、orz
0023デフォルトの名無しさん2005/07/12(火) 22:00:36
別にboost::tokenizerで十分だと思うけど……。
002412005/07/12(火) 22:06:02
>>23
やる前に言ってくれorz
0025デフォルトの名無しさん2005/07/12(火) 22:10:25
マァマァ。
boost使用禁止なんつー所もあるわけだし。
002612005/07/12(火) 22:51:06
ほかになんかない?
おれがやるかどうかはわからんケド。
0027レイナ2005/07/12(火) 23:25:41
C++Builderについて分かる方いらっしゃいますか?
002812005/07/13(水) 00:37:54
パターンマッチング関数作ってみたよ。
これを応用して正規表現にも挑戦する猛者はいませんか?
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

int isMatch(char* string,char* pattern);

int main(void)
{
char string[256];
char pattern[256];

printf("Enter a string:");
scanf("%s",string);
printf("Enter a pattern:");
scanf("%s",pattern);

if(isMatch(string,pattern))
{
printf("This string includes this pattern.\n");
}
else
{
printf("This string does'nt include this pattern.\n");
}
}
002912005/07/13(水) 00:38:18

int isMatch(char* string,char* pattern)
{
int i,j,temp;

for(i = 0;string[i] != '\0';i++)
{
if(string[i] == pattern[0])
{
temp = ++i;
for(j = 1;string[temp] == pattern[j];j++,temp++)
{
if(strlen(pattern) - 1 == j)return TRUE;
}
}
}
return FALSE;
}
0030デフォルトの名無しさん2005/07/13(水) 00:43:02
いやだからboost::regex。
0031デフォルトの名無しさん2005/07/13(水) 00:43:16
std::search.....
0032デフォルトの名無しさん2005/07/13(水) 07:26:56
マァマァ、C++禁止つー所もあるわけだし。
1ガムバレ。
0033デフォルトの名無しさん2005/07/13(水) 07:33:15
Cでも正規表現はいろいろあると思うよ。
0034デフォルトの名無しさん2005/07/13(水) 07:43:11
doesn't、な。
003512005/07/13(水) 09:34:35
あー、POSIXに正規表現定義されてるよ・・・
なんかだんだんやる気が・・・
0036デフォルトの名無しさん2005/07/13(水) 19:22:12
よく頑張った
003712005/07/13(水) 19:49:14
・゚・(ノД`)
0038デフォルトの名無しさん2005/07/13(水) 19:51:13
俺も思いついたら書き込むよ
頑張ったな>>1
0039デフォルトの名無しさん2005/07/13(水) 20:17:20
誰か仕様をくれ
0040デフォルトの名無しさん2005/07/13(水) 20:26:26
世の中に存在しないものとなると、なかなか難しいな。
0041デフォルトの名無しさん2005/07/13(水) 20:39:20
>>40
問題はそれなんだよな
汎用性と利便性がないとなると作る根拠が無いし
0042デフォルトの名無しさん2005/07/13(水) 22:17:00
win用のsshサーバとか・・・
ちょっとしたものではないか。cygwinあるし。
0043デフォルトの名無しさん2005/07/13(水) 22:49:02
>>29 のは、strstr() のマッチ位置を返さないのと何か仕様が違うの?

次は strtol() とかがちょうどいいかな?
004412005/07/13(水) 22:57:04
いや、そんな関数があること自体知らんかったとです。
>>18のsplitをperl版に近づけようと奮闘してみたもののうまくいかない。
これはなかなかムズかすぃ
004512005/07/13(水) 23:03:56
誰か漏れのあとを継いでくれませんか?
仕様は区切り文字に任意の文字列または文字を指定でき、かつ、複数の区切り
文字列または文字を指定できるsplit関数です。
一応、現在作成中の駄目コード置いときますね。
004612005/07/13(水) 23:05:04
#include <stdio.h>
#include <stdlib.h>

int *isMatch(char* string,char* pattern);
char **split(char *cutter, char* string);


int main(void)
{
char string[256];
char ** strings;
int i;
int *info;

printf("Enter a string including \"cut\":");
scanf("%s",string);

info = isMatch(string,"cut");
for(i=0;i<=info[0]+1;i++)
{
printf("%d\n",info[i]);
}

strings = split("cut",string);

for(i=0;strings[i]!='\0';i++)
printf("%s\n",strings[i]);
}
004712005/07/13(水) 23:06:00
//第一引数に引数の個数をとり、それ以降の引数は文字列分割用の文字列をとる
char **split(char *cutter, char* string)
{
int i,j=0,n=0,len = strlen(cutter);
char** strings;
int *info;

if(len > strlen(string))return NULL;

info = isMatch(string,cutter);

for(i=0;i<=info[0]+1;i++)
{
printf("%d\n",info[i]);
}


strings = (char **)malloc( (info[0]+2) * sizeof(char *) );

004812005/07/13(水) 23:06:54
for(i = 0; i < info[0] + 1; i++)
{
*(strings + i) = (char *)malloc( (info[i+1]+1) * sizeof(char *) );

for(j=0;j<info[i+1];j++)
{
strings[i][j] = string[n+j];printf("i=%d\ninfo[i+1]=%d\n",i,info[i+1]);
}
strings[i][j] = '\0';
n=j+len;
}

strings[i][0] = '\0';

return strings;
}
004912005/07/13(水) 23:07:29
//文字列の中にパターンとマッチする文字列があればその個数を配列の0番目に、
//1番目以降にはマッチしたパターンとの間の文字数を格納し、その配列を返す
int *isMatch(char* string,char* pattern)
{
int i,j,k=1,temp,count = 0;
int *info,len = strlen(pattern);

for(i = 0;string[i] != '\0';i++)
{
if(string[i] == pattern[0])
{
temp = ++i;
for(j = 1;string[temp] == pattern[j];j++,temp++)
{
if(len - 1 == j)count++;
}
}
}
005012005/07/13(水) 23:10:19
info = (int *)malloc((count+2) * sizeof(int *));
info[0] = count;
if(count == 0)return info;

//loop till string[i] will be \0.
for(count = 0, i = 0;string[i] != '\0';i++)
{
if(string[i] == pattern[0])
{
temp = i + 1;
for(j = 1;string[temp] == pattern[j];j++,temp++)
{
if(len - 1 == j)
{
info[k] = i-count;
i = i+len;
count = i;
k++;
if(string[i-1]=='\0')
{
info[k]=0;
return info;
}
}
}
}
}

info[k]=i-count;
return info;
}
0051デフォルトの名無しさん2005/07/14(木) 12:08:34
何で普通のCなの?
0052デフォルトの名無しさん2005/07/14(木) 13:03:54
C++にはboostがあるからじゃない?
0053デフォルトの名無しさん2005/07/14(木) 14:30:06
C なら pcre 使うのがいいのでは。
0054デフォルトの名無しさん2005/07/14(木) 20:42:56
                         .,Å
                      .r-‐i'''''''''''i''''‐-、
                    o| o! .o  i o !o
                    .|\__|`‐´`‐/|__/|
                     |_, ─''''''''''''─ ,、 /
                    、-'      u   -、  
                  / U          0 \
                 /          /     i
                 |   ● ,,.   .,, ●      | 
      __   .      !    (_人__)        ノ
  /´ ̄       `!.      丶_   u        U ノ
  |  `にこ匸'_ノ .       '-、、,,,,,,_______,,,,,,、、-'
  ノ u  {                 _.. -―| :{   ,/ /   \
. / l   | __  / ̄ ̄`>'´   ノ'    ´ {、    \
/ |/     {'´    `ヽ. " ̄\ U `ヽ.    __,,.. -‐丶 u  ヽ
| / ヾ、..  }      u' 〉、    }    `ー''´  /´ ̄ `ヽ '" ̄\
! :}  )「` ノ、     ノ l\"´_,,ニ=-― <´  ヽ{  ノ(   `、  |
l   、_,/j `ー一''"   },  ノ ,  '''''""  \   ヽ ⌒ヾ      v  |
ヽ   _         /   } {. { l ┌n‐く  ヽ/ ``\        ノ
  `¨´    `¨¨¨¨´ ̄`{ 0  `'^┴'ー┘|ヾ    }、 u'   `  --‐r'′ キングヤッタッス!!

0055デフォルトの名無しさん2005/07/19(火) 08:40:46
ホントにちょっとしか役に立たないプログラム。
だけどテキストエディタやsedやawkでバイナリエディットできるので便利。
// bin2hex
int main(void) {
  int c;
  // if windows set stream binary mode
  while ((c=getchar())!=EOF) printf("%02x\n");
  return 0;
}
// hex2bin
int main(void) {
  int c;
  // if windows set stream binary mode
  while (scanf("%x", &c) != EOF) putchar(c);
  return 0;
}
0056デフォルトの名無しさん2005/07/19(火) 09:10:24
>>55
前者がodではいけない理由は何?

私の場合はpgmのバイナリ⇔アスキー変換使ったりもするけど。
0057デフォルトの名無しさん2005/07/19(火) 12:32:35
odでもオーケーよ。
odはアドレスの出力がじゃまだし1行1バイトじゃないけど
フィルタ通せばいいことだし。
1行1バイトにしたい理由はsedやawkでアドレス指定が簡単だから。
あと関係ないけどこんな練習問題みたいなプログラムが実用的に機能し
他のコマンドと組み合わせることで強力なツールになる驚きと
自分で書いたプログラムが役に立つ喜び。
0058デフォルトの名無しさん2005/07/19(火) 14:09:17
いいけどさ、odでもこのくらいのことはできるよ。
od -v -t x1 -w1 -An
オプションの意味は、
-v verbose:'*'の抑制
-t type:フォーマット指定
 x1 16進で1バイトずつ
 c キャラクタダンプ
 d 10進
 f 浮動小数点数
 ...
-w1 width:出力カラム数(=バイト数)指定
-An address:アドレス表示の進法指定(d:10進、n:none、...)
或いは、
od -Ax -t cx2d4f8
なんてこともできる。
道具の再生産もいいけど、既にある道具は積極的に利用しようや。
0059デフォルトの名無しさん2005/07/19(火) 15:35:41
odが便利なのは知ってるよ。
ちなみにうちのodには-wがないのでこんなかんじになる。
$cat bin2txt
#!/bin/sh
od -t x1 | awk '{for(i=2;i<=NF;++i)print $(i)}'
0060デフォルトの名無しさん2005/07/19(火) 22:03:25
宿題でないのでこちらにおながいします。

【仕様諸元】
- 言語:C++(gnu 表記に準じること)
- 行数:30行前後
- 1行1項目のテキスト整数値(マイナスあり)の約6千行のデータをパイプ入力して
  プラス(>0)の最大値、最小値、平均値、マイナス(<0)の最大値、最小値、平均値と
  絶対値平均、プラスマイナス全ての総合平均、計算対象となった件数を計算し、結果を
  標準出力する。数値間は1つのスペース。
- 入力された数値がゼロならば計算対象から省く。
- 総合平均のための変数は浮動小数点で定義してもよい。
- 依頼元:○徳高校
- 対価:氏名或いはハンドル名の公開。
0061デフォルトの名無しさん2005/07/19(火) 23:19:25
そんなもん、awkで充分じゃん。やる気にならん。
0062デフォルトの名無しさん2005/07/20(水) 03:06:53
>>60 動くかどうかのテストしかしてないし信頼性は保証しない。マイナスの絶対値平均ってなに?
これをいったいなにに使うのかちょー気になる。
>>61 何が十分なのか、意味分かんない。もしかしてawkだとワンライナーなのか?
#include <stdio.h>
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
int main(void) {
    int p_max=0,p_min=0,p_cnt=0; double p_ave=0;
    int m_max=0,m_min=0,m_cnt=0; double m_ave=0;
    double t_ave=0;
    int i;
    while (scanf("%d", &i) == 1) {
        if (i > 0) {
            if (p_cnt == 0) p_min = i;
            p_max = MAX(p_max, i); p_min = MIN(p_min, i); ++p_cnt; p_ave += (i - p_ave) / p_cnt;
        } else if (i < 0) {
            if (m_cnt == 0) m_max = i;
            m_max = MAX(m_max, i); m_min = MIN(m_min, i); ++m_cnt; m_ave += (i - m_ave) / m_cnt;
        }
        if (i != 0) t_ave += (i - t_ave) / (p_cnt + m_cnt);
    }
    printf("%d %d %.0f %d %d %.0f %.0f %.0f %d\n",p_max,p_min,p_ave,m_max,m_min,m_ave,-m_ave,t_ave,p_cnt+m_cnt);
    return 0;
}
0063602005/07/20(水) 06:20:18
>>62 一発でとおりやした。すばらしいです。
>マイナスの絶対値平均ってなに?
絶対値は、プラスとマイナスを対象なのでマイナスだけの処理でないという
ことですた。

>これをいったいなにに使うのかちょー気になる。
防災科研の未公開のデータ(日本中の地下で起きている極微小振動)をグラフ
にするための前処理です。

php のスクリプトと比較して10倍以上速いです。システムのオーバーヘッド
も4分1に低減しました。感謝致します。
URL は置き換え作業後、明らかに致します。
0064デフォルトの名無しさん2005/07/20(水) 08:40:02
うわ、ださ。こんなコードよく晒せるな。
0065612005/07/20(水) 11:22:03
まぁ、確かに。
>62は仕様も読めないらしいし、余り効率いいとは思えないコードだし。
>63も手放しで誉めずにきちんと仕様を満たしているのか確認しろよ。

あー、ついでに>61に回答しておくと、awkで書いてもワンライナーと言うわけにはいかない。
単にC++であるメリットを感じないだけ。
0066612005/07/20(水) 12:08:11
一部どうでもいい訂正。
>C++であるメリットを感じないだけ
C++で書く楽しみを感じないだけ

>60はもう見てないかな。見てるんだったら少なくとも仕様を満たすものを載せるけど。
つーか、phpのスクリプトがあるなら先に提示しろと思うのだが。
0067602005/07/20(水) 20:25:13
現在は、下のコードで稼動しています。

#include <stdio.h>
#include <stdlib.h>
#define MAX(a,b) a>b?a:b
#define MIN(a,b) a<b?a:b
int main(void) {
int p_max=0,p_min=0,p_cnt=0; double p_ave=0;
int m_max=0,m_min=0,m_cnt=0; double m_ave=0;
double a_ave=0, t_ave=0;
int i;

while (scanf("%d", &i) == 1) {
if (i > 0) {
if (p_cnt == 0) p_min = i;
p_max = MAX(p_max, i); p_min = MIN(p_min, i); ++p_cnt; p_ave += (i - p_ave) / p_cnt;
} else if (i < 0) {
if (m_cnt == 0) m_max = i;
m_max = MAX(m_max, i); m_min = MIN(m_min, i); ++m_cnt; m_ave += (i - m_ave) / m_cnt;
}
if (i != 0) {
t_ave += (i - t_ave) / (p_cnt + m_cnt);
a_ave += (abs(i) - a_ave) / (p_cnt + m_cnt);
}
}
printf("%d %d %d %d %.0f %0f %.0f %.0f %d\n",p_max,m_max,p_min,m_min,p_ave,m_ave,a_ave,t_ave,p_cnt+m_cnt);
return 0;
}
0068602005/07/20(水) 20:26:43
↑つづき

防災科研の元ページ(地震速報が気象庁よりも速い。約1分後に発表):
ttp://www.hinet.bosai.go.jp/
ここの連続波形データを元から1分値を算出して最終的には下のグラフ用の
データセットにつなげるということでした。

今回の役立ったプログラムの成果物:
ttp://eq.nazarite.jp/hinet.php
0069デフォルトの名無しさん2005/07/20(水) 21:49:06
>>67
ループ中で毎回平均値が必要になるなら兎も角、
最後に必要になるならそのロジックは毎回平均値を求めると言う
誤差を累積させてしまう糞コードだ。
おまけに、折角入力値の正負を判断しているのに改めて絶対値を求めたり、
突っ込みどころが満載のゴミの山と化しているな。
#まぁ、官公庁で稼動しているコードがゴミの山なのは先刻承知だが。
0070デフォルトの名無しさん2005/07/21(木) 01:33:31
「必要十分」って言葉、知ってますか?
平均値を蓄積する方法と最後に割算して求める方法を
ランダムな入力で試すと常に同じ結果になりましたがそれでも不満ですか?
あなたが想定するまずいケースはどんな場合ですか?
多少無駄でもコードを意味的に分けるのは絶対に間違っていますか?
あなたが61だとすると、awkで十分と言うわりには
数クロックの無駄にめくじら立てたりおもしろい人ですね。
あとどこら辺が仕様を満たしてないのか興味あります。
まさかインデントが...とか言わないよね。
それより早く「正解」を見せてね(ハート)
0071デフォルトの名無しさん2005/07/21(木) 07:45:05
>>70
何むきになってるの? >>61(=>>65)言うところの「あまり効率いいとは思えないコード」を書く
「仕様も読めないらしい」>>62本人?

平均値は入力値を積算してループ脱出後に件数で割るのが「ふつー」。
ふつーじゃないコードを私ゃ糞とまでは言わないけどね。
それと、>>69は速度を云々しているわけではないんでないかな?
それさえ読み取れないから>>61に馬鹿にされているんでしょ。

で、もし>>70=>>62なら、自分のコードが仕様を満たしてないことにホントに気付いてないの?
>>69は>>67のコードのことしか書いてないのに自分が攻撃されてると思ってファビョってるのかな?
0072デフォルトの名無しさん2005/07/21(木) 10:12:16
>>70
> ランダムな入力で試すと常に同じ結果

    for (unsigned j = 0; j < 30000; ++j) {
      int i = rand();
      sum += i;
      ++count;

  printf("%d %d %d %d %f %0f %f %f %d\n",p_max,m_max,p_min,m_min,p_ave,m_ave,a_ave,t_ave,p_cnt+m_cnt); 
  printf("%f\n", ((double)sum)/count);
  printf("%f\n", ((double)sum)/count - t_ave);

32765 0 1 0 16489.450448 0.000000 16489.450448 16489.450448 29999
16488.900800
-0.549648
007361=652005/07/21(木) 12:56:39
>>70(=62という前提で)
一応呼ばれたみたいだから書くけど、
自分のソースの間違いを>67が修正して使っているということは理解できてんの?
あんたの場合「必要充分」の意味自体も取り違えていそうだけど、
仕様を満たしていないものしか書いてないのだからそれ以前なんだけど。
後は>71と>72が指摘してくれているので割愛。
まぁ、普段はそんな必要もないけど、有効精度の求め方も知らないんだろうなぁ。

ここからは余談というか愚痴。
Excelでstdevの計算値がおかしいと思ったらバージョンによって結果が違う罠。
自作のawkスクリプトに通したらそれでも未だ変。
結局、long doubleの精度が必要だった。CV値1e-7なんてそんなもんさ……
0074722005/07/21(木) 14:01:19
スマソ i==0 の場合があったみたい。
do i=rand(); while (i == 0); としてみた。

32765 0 1 0 16489.199800 0.000000 16489.199800 16489.199800 30000
16489.199800
-9.45874e-011

同じに見えても誤差はあるってことだな。
0075デフォルトの名無しさん2005/07/21(木) 14:29:21
>>73
お互いうっとうしいだろうから最後にするよ。
絶対値平均については、それは意味が分からないと言ってあるでしょ。
なにも問題ない。
それ以外になにかあるなら言ってみなよ。もう反応しないから
言わなくてもいいけど。
おまえは間違っている、何が間違っているかは自分で考えろ
なんてヤクザか新興宗教のセリフだよ。
誤差についてはまぁ誤解のある表現だったね。
結果とは%.0fの出力であって、doubleどうしの比較のつもりじゃなかった。
そして6000くらいのデータで無視できない程の誤差はでないということね。
0076デフォルトの名無しさん2005/07/21(木) 15:42:06
6000 回 1, -1 を交互に並べると %0f でも
1 -1 1 -1 1.000000 -1.000000 1.000000 -0.000000 6000
                                      ^^^^^^^^^
なんて出てテラキモス
0077デフォルトの名無しさん2005/07/21(木) 18:27:52
>>76
どこに波線? 見たところ1.000000に引いてあるようだけど、問題視しているのは-0のことだよね?
0078デフォルトの名無しさん2005/08/04(木) 20:13:58
// 停滞しているから落としてみよう。
// 各整数型のビット数を数える関数
// >>が多過ぎって怒られたから≫で代用w
static inline unsigned count(unsigned long bits)
{
 bits -= bits ≫ 1 & 0x55555555;
 unsigned tmp = (bits & 0x33333333) + (bits ≫ 2 & 0x33333333);
 tmp += tmp ≫ 4;
 tmp &= 0x0f0f0f0f;
 tmp += tmp ≫ 8;
 tmp += tmp ≫ 16;
 return (unsigned char) tmp;
}
static inline unsigned count(unsigned short bits)
{
 bits -= bits ≫ 1 & 0x5555;
 unsigned tmp = (bits & 0x3333) + (bits ≫ 2 & 0x3333);
 tmp += tmp ≫ 4;
 tmp &= 0x0f0f;
 tmp += tmp ≫ 8;
 return (unsigned char) tmp;
}
static inline unsigned count(unsigned char bits)
{
 bits -= bits ≫ 1 & 0x55;
 unsigned tmp = (bits & 0x33) + (bits ≫ 2 & 0x33);
 tmp += tmp ≫ 4;
 return tmp & 0x0f;
}
0079デフォルトの名無しさん2005/08/07(日) 01:45:09
>>78

テンプレートにまとめた方がよくね?
0080デフォルトの名無しさん2005/08/07(日) 02:07:17
>>79
そのメリットを感じないのだけれど、何かあるかね。
■ このスレッドは過去ログ倉庫に格納されています