Vaclav_ Ответов: 3

Как решить C неправильным математическим результатом ?


I will freely admit not  being computing math guru, but this one got me stomped. 
I just cannot see what I am  doing wrong. 

Code 
float hypotenuse;
				hypotenuse = 1.0 - .1;			// OK
				printf("\nhypotenuse of  circle %i %f", (int) R + 1,
						hypotenuse);

				hypotenuse = 1.0 - (float) radius; // wrong result 
				printf("\nhypotenuse of  circle %i %f", (int) R + 1,
						hypotenuse);

Results 
radius  difference between  base and circle 0 0.100000
hypotenuse of  circle 1 0.900000            OK 
hypotenuse of  circle 1 1.090909            why not 0.9 ?? 


Текст скопирован из LibreOffice.

Что я уже пробовал:

Нет, я уже не спрашивал Миссис Гугл и RTFM.

Patrice T

Опубликуйте фрагмент кода, который мы можем запустить.
Какова величина радиуса ?

phil.o

У Круга нет гипотенузы, а у прямоугольного треугольника есть.

Richard MacCutchan

Каковы значения R и радиуса? А что такое гипотенуза круга?

KarstenK

никогда не вычисляйте в операторе printf. Используйте переменную, ее достаточно :-O

3 Ответов

Рейтинг:
15

Vaclav_

Прежде чем какая-то полиция встревожится , я предлагаю перенести это на настоящий дискуссионный форум.


К сожалению, из-за некоторых технических трудностей с местным интернет-провайдером часть поста была пропущена.
Я обычно проверяю входы, чтобы предотвратить Гиго.

Итак, чтобы вернуться к решению и пропустить весь лишний пух - если я добавлю

радиус = .1;

как указано - все хорошо.

????


Это для тех, кто хотел увидеть код.

	// radius difference
				float radius_new  = (float) IMG_circle[1].radius - (float) IMG_circle[0].radius;
				printf("\nradius  differece between  base and cicrcle %i %f", R,
						radius_new);
				float hypotenuse;
				float hypotenuse_new;
				//radius = .1;
				hypotenuse = 1.0 - .1;			//- (double) radius;
				//printf("\nhypotenuse of  cicrcle %i %f", (int) R,
				//		hypotenuse);
// BUG
				float base = 1.0;
				hypotenuse_new = base - (float) radius_new; //  (float) radius;
				hypotenuse_new = base -( (float) IMG_circle[1].radius - (float) IMG_circle[0].radius);
				printf("\nBase circle radius     %f ",(float) IMG_circle[0].radius);
				printf("\nCurrent circle radius  %f ",(float) IMG_circle[1].radius);
				printf("\ndiff (hypotenuse_new)  %f ",(float) IMG_circle[1].radius - (float) IMG_circle[0].radius);
				printf("\ndiff (hypotenuse_new)  %f ",(float) IMG_circle[0].radius - (float) IMG_circle[1].radius);
				printf("\nnew hypotenuse of  circle of radius %f %i %f", radius_new, (int) R,
						(float) hypotenuse_new);


А вот и текущий выход

radius  differece between  base and cicrcle 0 0.100000
Base circle radius     1.000000 
Current circle radius  0.909091 
diff (hypotenuse_new)  -0.090909 
diff (hypotenuse_new)  0.090909 
new hypotenuse of  circle of radius -0.090909 0 1.090909
hypotenuse of  cicrcle 1 0.810000


Пожалуйста, обратите внимание, что первый printf печатает положительный радиус - что я предположил, было правильно.
При использовании тех же значений изменился "текущий радиус окружности".

Я действительно не уверен, где моя ошибка и как ее решить.
И это только начало расчетов...


// radius difference
            float radius = IMG_circle[1].radius - IMG_circle[0].radius;
            printf("\nradius  differece between  base and cicrcle %i %f", R,
                    radius);
            float hypotenuse;
            hypotenuse = 1.0 - .1;          //- (double) radius;
            printf("\nhypotenuse of  cicrcle %i %f", (int) R + 1,
                    hypotenuse);

                           radius = .1;

            hypotenuse = 1.0 - (float) radius;
            printf("\nhypotenuse of  cicrcle %i %f", (int) R + 1,
                    hypotenuse);


radius  differece between  base and cicrcle 0 0.100000
hypotenuse of  cicrcle 1 0.900000
hypotenuse of  cicrcle 1 1.090909


Richard MacCutchan

Что такое R- и что именно ты пытаешься сделать? Все, что я вижу, - это то, что вы печатаете разницу между 1,0 и 0,1. и вы уже должны знать о врожденных проблемах точности с числами с плавающей запятой.

Рейтинг:
0

OriginalGriff

Если я дамми в переменных вы не показываете определения или значения для них:

#include <stdio.h>

int main()
    {
    float hypotenuse;
    float radius =  0.1;
    int R = 666;
    hypotenuse = 1.0 - .1;			// OK
    printf("\nhypotenuse of  circle %i %f", (int) R + 1,
    		hypotenuse);
    
    hypotenuse = 1.0 - (float) radius; // wrong result 
    printf("\nhypotenuse of  circle %i %f", (int) R + 1,
    		hypotenuse);
    
    return 0;
    }
Я получаю то, что ожидал:
hypotenuse of  circle 667 0.900000                                                                 
hypotenuse of  circle 667 0.900000                                                                 
                                                                                                   
...Program finished with exit code 0
Поэтому я думаю, что вам нужно посмотреть на содержание вашего radius использование отладчика для вашей системы. Я подозреваю, что это не то, что вы думаете...


Рейтинг:
0

Vaclav_

Было бы уместно попросить удалить / удалить этот поток?
Теперь это уже не имеет значения.
Перешел на реальный дискуссионный форум.


CHill60

Вы можете удалить свой собственный вопрос, который удалит весь поток. Наведите курсор мыши на свой пост и нажмите на значок, который выглядит как мусорная корзина

Vaclav_

Извините, в оригинальном посте нет мусорной корзины, только в разделе "Решения". Не хочу делать что-то огорчительное для форума, удаляя их.