/*
    出されたお題をコーディングして罵られるスレ
    http://t...content-available-to-author-only...h.net/test/read.cgi/tech/1354393458/18
        実数 x の n 乗根を求めよ。
        ただし、
        ・math.hを使わない
        ・double x > 1.0 の任意
        ・int n > 1 の任意
*/
#include<stdio.h>
#include<stdlib.h>
//#include<float.h>

int main()
{
    char buff[256];
    double x;
    int n;
    int i;
    double xmin, xmax, tmp, seki;

    while (1) {
        // 入力
        printf("\n入力 (範囲外の数値を入力するか、Ctrl+C で終了)\n");
        printf(" x (>1.0) = ");
        fgets(buff, sizeof(buff), stdin);
        x = atof(buff);
        if (x <= 1.0) {
            printf("exit\n");
            return 1;
        }
        printf(" n (>1  ) = ");
        fgets(buff, sizeof(buff), stdin);
        n = atoi(buff);
        if (n <= 1) {
            printf("exit\n");
            return 2;
        }
        // xmax, xmin の中間値 tmp を実際にn乗した結果を目的の x と比較して、
        // 違えば xmax, xmin の値を狭めていく
        xmin = 1.0;
        xmax = x;
        while (1) {
            // 中間値
            tmp = (xmin + xmax) / 2;
            // tmp が xmax, xmin どちらかにくっついてしまったら、これまで
            if (tmp == xmin || tmp == xmax) {
                break;
            }
            // 実際にn乗
            seki = 1.0;
            for (i = 0; i < n; i++) {
                seki *= tmp;
            }
            // 判定して狭める
            if (seki < x) {
                xmin = tmp;
            } else if (seki > x) {
                xmax = tmp;
            } else {
                break;          // ジャスト
            }
        }
        // 結果表示
        printf("result = %.10f\n", tmp);
        // 確認
        seki = tmp;
        for (i = 1; i < n; i++) {
            seki *= tmp;
        }
        printf("(check = %.10f)\n", seki);
    }

    return 0;
}

//DBL_EPSILON