2013-11-30 4 views
-1

Я просто искал способ получить корни куба в vb.net. Консенсус в Интернете является использовать формулу:vb.net кубический корень дает неправильное значение?

<number>^(1/3) 

Я пытался пробивать некоторые из них в ближайшее окно и вот что я получаю:

?1^(1/3) 
1.0 
?8^(1/3) 
2.0 
?27^(1/3) 
3.0 
?64^(1/3) 
3.9999999999999996 

Подождите минуту .. Если не ответ 4.0? Что случилось? 4 * 4 * 4 = 64, а не 3.9999999999999996 * 3.9999999999999996 * 3.9999999999999996 = 64. Обычно я хорошо разбираюсь в математических проблемах, но я потратил слишком много времени на это, и я мог бы использовать некоторую помощь. Мне неинтересно узнать, почему это не так сильно, как мне интересно, как сделать эту работу с учетом числа 64 и попытаться получить корень куба равным 4.

+6

[Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html) –

+0

Nice. Теперь, как мне «исправить» его? Округление, вероятно, не будет работать, потому что я также должен иметь возможность обнаруживать, когда число не кубирует правильно, проверяя остаток. Пример: 65^(1/3) = 4.0207257585890579 –

+1

Не знаете, что вы хотите «исправить», поскольку ничего не сломано. :-) Поиск здесь для сравнения [.net] с плавающей запятой возвращает некоторые полезные ссылки. Вы не можете сравнивать значения с плавающей запятой для точных эквивалентов, кроме случаев, когда они отвечают определенным требованиям, как объясняет связанная мной статья. Вам нужно будет решить, что такое приемлемая дельта, и внести коррективы, чтобы разрешить округление, если разница между значениями попадает в этот дельта-предел или нет и считается равной. Я не знаю, какова ваша допустимая дельта. –

ответ

0

Это работает для меня:

Private Function CubedRoot(ByVal dNum As Double) As Double 

     Return CType(CType(dNum^(1/3), Decimal), Double) 

End Function 
+0

Спасибо, Роб, это именно то, что я искал! Ура! –

Смежные вопросы