Есть ли усечение?

Я пытаюсь рассчитать радиус мяча, который можно сделать, если у меня есть кожа площадью 4195065486 мм2 и толщиной 1 мм, начиная с маленького шарика с радиусом = 1 мм, производитель может обернуть кожу как многослойную вокруг мяча. Я написал этот код, чтобы получить радиус мяча, который можно сделать, и площадь, которая останется от кожи. (при условии, что пи = 3,14159).

double A, r;
const double pi=3.14159;
double AreaCalc(double r);
int main(){

    A=4195065486.0;
    r=1.0;
    double final_r = AreaCalc(r); 
    cout<<final_r<<"  "<<A<<"  "<<endl;
    return 0;
}

double AreaCalc(double r){
    double ca;

    ca=4*pi*r*r;
    if (A-ca>=0.0){

        A=A-ca;
        AreaCalc(r+1);
    }
    else return r;
}

Есть ли какое-либо усечение или влияние, которое может привести к неточному результату A? Путем отладки я могу получить A=12559904.940002432.


person Aan    schedule 30.10.2013    source источник
comment
Каков ваш результат и чего вы ожидаете?   -  person Sambuca    schedule 30.10.2013
comment
Если вы собираетесь использовать двойную точность, вам следует, по крайней мере, использовать достаточно точное значение π — предпочтительно использовать M_PI из <cmath>.   -  person Paul R    schedule 30.10.2013
comment
@PaulR: вопрос предполагает, что число пи = 3,14159, не меньше и не больше.   -  person Aan    schedule 30.10.2013
comment
@PaulR (Или 4 * atan(1), если M_PI недоступен.)   -  person    schedule 30.10.2013
comment
У вас есть очень странная смесь глобальных и локальных переменных, параметров и возвращаемых значений. Глобальные переменные имеют тенденцию делать рекурсию очень сложной для отслеживания и вызывать ошибки.   -  person molbdnilo    schedule 30.10.2013
comment
Гораздо проще: по площади и толщине кожи вычисляют ее объем. Теперь вычислите радиус шара с этим объемом.   -  person Henrik    schedule 30.10.2013
comment
@ Хенрик: Я не думаю, что это возможно, потому что идея состоит в том, чтобы обернуть кожу уже существующим мячом, и если я воспользуюсь вашим методом, оставшаяся кожа может остаться.   -  person Aan    schedule 30.10.2013
comment
@Aan, просто возьми floor(radius in mm).   -  person Henrik    schedule 30.10.2013


Ответы (1)


Вы пропустили return в ветке if, что привело к неопределенному поведению.
Добавьте его:

return AreaCalc(r+1);

Вы должны были получить предупреждение компилятора об этом.
Если нет, увеличьте уровень предупреждения.
Если да, начните обращать внимание на предупреждения. Опция вашего компилятора «Рассматривать предупреждения как ошибки» — очень правильный выбор.

(Но, как предлагает @Henrik в комментариях, математика — лучшее решение.)

person molbdnilo    schedule 30.10.2013
comment
Таинственное эхо вдали от фона: И компиляция с включенными предупреждениями...! предупреждения включены...! включено...! вел...! - person ; 30.10.2013