Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

sqrt (x*x) == x

閲覧: 3 回
最初の未読メッセージにスキップ

Fujii Hironori

未読、
2003/08/23 3:50:122003/08/23
To:
sqrt (x*x) == x が真となることを前提としたプログラムを見たのですが、
真となるものですか。

sqrt をニュートン法で誤差が十分小さくなったら終了とし、
誤差がでる処理系があるのではないかと思いまして。
ちなみに、いくつか実験したら真でした。

#include <stdio.h>
#include <math.h>

#define test(x) printf ("%s " #x "\n", sqrt (x*x) == x ? "t" : "f")

int main (void)
{
test (3.0);
test (3);
test (123.456);

return 0;
}

R4000 2.2

未読、
2003/08/23 4:43:052003/08/23
To:
こんにちは、立花@鎌ヶ谷市です。

Fujii Hironori <fu...@chi.its.hiroshima-cu.ac.jp> writes:

> sqrt (x*x) == x が真となることを前提としたプログラムを見たのですが、
> 真となるものですか。

常には成り立たないと思います。

> sqrt をニュートン法で誤差が十分小さくなったら終了とし、
> 誤差がでる処理系があるのではないかと思いまして。
> ちなみに、いくつか実験したら真でした。

手元(gcc version 2.95.3, glibc 2.2 on Plamo Linux2.2.6)で
Fujii さんのテストプログラムを動かしてみたら、

t 3.0
t 3
f 123.456

でした。
もちょっと試すと、

t 3.0
t 3
f 123.456
f 123.2
t 123.25
t 123.5
t 123.75
f 123.8

です。

--
ta...@kc5.so-net.ne.jp 立花 晃@鎌ヶ谷市

Fujii Hironori

未読、
2003/08/23 5:17:262003/08/23
To:
At 23 Aug 2003 17:43:05 +0900,

R4000 2.2 wrote:
>
> こんにちは、立花@鎌ヶ谷市です。
>
> Fujii Hironori <fu...@chi.its.hiroshima-cu.ac.jp> writes:
>
> > sqrt (x*x) == x が真となることを前提としたプログラムを見たのですが、
> > 真となるものですか。
>
> 常には成り立たないと思います。

やはりそうでしたか。
どうもありがとうございます。

> > sqrt をニュートン法で誤差が十分小さくなったら終了とし、
> > 誤差がでる処理系があるのではないかと思いまして。
> > ちなみに、いくつか実験したら真でした。
>
> 手元(gcc version 2.95.3, glibc 2.2 on Plamo Linux2.2.6)で
> Fujii さんのテストプログラムを動かしてみたら、

立花さんのテストをみて気づいたのですが、
123.456ってのは2進数では循環小数でまともに2乗できない数値でした。

---
藤井宏憲

新着メール 0 件