str((0-1)%100) おかしいですかNo.02578
番頭++ さん 99/02/17 20:02
 
str((0-1)%100) おかしいですか

AD 2000 のメールをもらったんですが、??? おかしいですか ???

//test1.mac
message "str((2-1)%100)\n\n" + str((2-1)%100);
message "str((1-1)%100)\n\n" + str((1-1)%100);
message "str((0-1)%100)\n\n" + str((0-1)%100);//???
message "str((0-2)%100)\n\n" + str((0-2)%100);//???
message "str((100+0-1)%100)\n\n" + str((100+0-1)%100);//OK !!!
endmacro;

ことの発端は、

#yy = val(date);//AD 1999 では、
message "昨年は " + str(#yy-1);//AD 1999 には "98" OK !!!
endmacro;

#yy = 00;//AD 2000
message "昨年は " + str(#yy-1);//AD 2000 には "-1" NG ???
endmacro;

これを補うべく、

#yy = 00;//AD 2000
message "昨年は " + str((#yy-1)%100);//AD 2000 には "95" ???
endmacro;

まともに考えれば、

#yy = 00;//AD 2000
message "昨年は " + str((100+#yy-1)%100);//AD 2000 には "99" !!!
endmacro;

でした。

[ ]
RE:02578 str((0-1)%100) おかしいですかNo.02579
Arimac さん 99/02/17 20:50
 
>str((0-1)%100) おかしいですか

-1は32ビット符号なしだと4294967295なので
100で割った余りは95になります(^^;
(限りなく変だと思う(^^;)

[ ]
RE:02579 str((0-1)%100) おかしいですかNo.02581
ひろ さん 99/02/18 09:32
 
 番頭++ さん、Arimacさん今日は、ひろです。
> >str((0-1)%100) おかしいですか
>
> -1は32ビット符号なしだと4294967295なので
> 100で割った余りは95になります(^^;
> (限りなく変だと思う(^^;)
 おかしいといえば、おかしいし。おかしくないといえばおかしくないわけ
で(^^;。
 やはり何処かを区切りとして、macro 内部で xx 以上は 19xx、以下は
20xx とするしかないのだろうか? xx は秀丸 Ver.1.0 の公開の年ということ
で(^^)。(だけど何時だっただろう???)

[ ]
RE:02581 str((0-1)%100) おかしいですかNo.02583
番頭++ さん 99/02/18 12:30
 
Arimac さん、ひろさん、今日はです。

>> -1は32ビット符号なしだと4294967295なので
>> 100で割った余りは95になります(^^;
>> (限りなく変だと思う(^^;)

「数値型変数は4バイトの符号付きの値を記憶することができます。」

を前提とスルと、
これが割り算の基本ですから、

message str(11/10);//1
message str((-11)/(-10));//1
message str((-11)/10);//-1
message str(11/(-10));//-1

余りは、

message str(11-(11/10)*10);//1
message str((-11)-((-11)/(-10))*(-10));//-1
message str((-11)-((-11)/10)*10);//-1
message str(11-(11/(-10))*(-10));//1

とスルと、何なのだこれは ???

message str(11%10);//1
message str((-11)%(-10));//???==> -1
message str((-11)%10);//???==> -1
message str(11%(-10));//???==> 1

剰余は被除数の符号と同じという考えが普通ですよね ...
ですから、符号によって絶対値をとります。
あちきも、昨日初めて知ったという、くらいですから、
いまさら、という意見があるかも知れません 。。。

> やはり何処かを区切りとして、macro 内部で xx 以上は 19xx、以下は
>20xx とするしかないのだろうか? xx は秀丸 Ver.1.0 の公開の年ということ
>で(^^)。(だけど何時だっただろう???)

あちきは、< 1980 にしました。(現在はこうしています。)
pk_get_today1:
##i = val(leftstr(date,2));
$$today1 = midstr("19,20",(!(##i<80)-1)*3,2) + leftstr(date,8);//yyyy/mm/dd
return $$today1;

[ ]
RE:02583 str((0-1)%100) おかしいですかNo.02599
番頭++ さん 99/02/23 15:21
 
> 剰余は被除数の符号と同じという考えが普通ですよね ...

この件ですが、Ver. 3.00 β 22 から、

message str(11%10);// 1
message str((-11)%(-10));//-1
message str((-11)%10);//-1
message str(11%(-10));// 1

にしていただきました。ご苦労様です。

ちなみに、

「 Ms 固有の仕様 」
「 Visual C++ では、剰余式の結果は、必ず第 1 オペランドと同じ符号です。」

だそうです。ということは ANSI C にその規定はないのかな ???

    printf("(( 11) %% ( 10)))  - %d\n",(( 11)%( 10)));
    printf("((-11) %% (-10)))  - %d\n",((-11)%(-10)));
    printf("((-11) %% ( 10)))  - %d\n",((-11)%( 10)));
    printf("(( 11) %% (-10)))  - %d\n",(( 11)%(-10)));

で確かめるしかないのかな、処理系に依存 ???

[ ]
RE:02599 str((0-1)%100) おかしいですかNo.02600
Arimac さん 99/02/24 00:10
 
>で確かめるしかないのかな、処理系に依存 ???

「ANSIC言語大辞典」では処理系に依存すると書いてあります(^^;

fmod()関数の場合は除数の符号と同じになるようです。

[ ]
RE:02600 str((0-1)%100) おかしいですかNo.02602
番頭++ さん 99/02/24 12:34
 
>>で確かめるしかないのかな、処理系に依存 ???
>
>「ANSIC言語大辞典」では処理系に依存すると書いてあります(^^;
>
>fmod()関数の場合は除数の符号と同じになるようです。

Arimacさん、どうもです。
やっぱし、そうですか。自分の思い込みが、また一つ知識になりました。

[ ]