2016-01-28 9 views
-2

Я пытаюсь выяснить, как отображать квадратный корень из числа, если он оказывается отрицательным (поскольку он вводится пользователем), и если да, то правильно отобразите его с отображаемым «i». Когда я делаю нормальную функцию sqrt, результат всегда будет что-то вроде -1. ​​# IND. Когда я попытался использовать двойные комплексные переменные, положительные числа и отрицательные числа получились бы чистыми.Как распечатать квадратный корень отрицательного числа с i, отображаемым в C

Ниже мой код; комментарии - вот моя цель. Переменные 4 num вводятся пользователем и могут быть любыми целыми, положительными или отрицательными.

// Display the square root of each number. Remember that the user can enter negative numbers and 
// will need to find the negative root with the "i" displayed. 
printf("\nThe square root of %d is %.4f", num1, sqrt(num1)); 
printf("\nThe square root of %d is %.4f", num2, sqrt(num2)); 
printf("\nThe square root of %d is %.4f", num3, sqrt(num3)); 
printf("\nThe square root of %d is %.4f", num4, sqrt(num4)); 
+0

AFAIK, нет возможности короткого замыкания. Вы должны убедиться, что передаете неотрицательное значение в 'sqrt()' и напечатаете 'i', если исходное значение было отрицательным. Даже если вы используете сложные арифметические функции, я не думаю, что есть способ распечатать сложные значения с помощью '' printf() '] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html) кроме того, что они анализируют реальную и мнимую части и печатают их отдельно. –

+1

"* Когда я попытался использовать двойные комплексные переменные, положительные числа и отрицательные числа получились бы чистыми. *« Что это значит? Это должно работать, но вы не показали свой код, который пытался это сделать, только вызов 'sqrt()', который явно не работает. –

+1

['sqrt'] (http://en.cppreference.com/w/c/numeric/math/sqrt) работает с типом с плавающей точкой и возвращает один и тот же тип с плавающей запятой, поэтому как он может принять комплекс тип? И он не работает с отрицательными значениями, потому что он не возвращает сложный тип. Вы читали документацию? –

ответ

1

псевдокод:

string root(int num) { 
    return "" + sqrt(abs(num)) + (num < 0) ? "i":""; 
} 

В качестве альтернативы:

printf("\nThe square root of %d is %.4f%s", num1, sqrt(abs(num1)), (num1 < 0) ? "i":""); 
+0

Вопрос не помечен C++. –

+0

Несомненно, но это иллюстрирует, как это сделать на любом языке. OP может записывать на C, как он считает нужным. – gator

+0

Хороший улов. Ред. – gator

2

Вы можете использовать:

if (num1 < 0) 
{ 
    printf("\nThe square root of %d is %.4fi", num1, sqrt(-num1)); 
} 
else 
{ 
    printf("\nThe square root of %d is %.4f", num1, sqrt(num1)); 
} 
+1

Обычно это '3 + 4i', а не' 3 + i4' для полного комплексного номера, поэтому '4i', а не' i4' для чистого мнимого числа, не так ли? Но это ничто. –

+0

@JonathanLeffler, ваш комментарий заставил меня врасплох. Я помню (возможно, неправильно) с помощью 'a +' * i * 'b' большую часть своей жизни. При поиске в Википедии они используют 'a + b' * i *. –

+0

Не исключено, что это культурная вещь - некоторые культуры используют одну нотацию, а другие - другую. И это может быть моя ошибка; Я просто посмотрел на антикварную «Книгу научных данных», и она показывает _Z = x + iy = r (cosθ + i sinθ) _. –

2

Если вы работаете с плавающей точкой вы можете использовать встроенные в сложных утилит, например:

#include <complex.h> 
#include <stdio.h> 

int main(void) 
{ 
    double complex num = -4.0; 
    double complex s = csqrt(num); 

    printf("%.2f + %.2fi\n", creal(s), cimag(s)); 
} 

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

  • Нет связанных вопросов^_^