Como tornar uma variável float complexa ou dupla complexa dependendo da entrada do usuário? Estou tentando traçar o conjunto de Mandelbrot e tenho o mesmo código longo para float e double, mas em alguns casos float não é preciso o suficiente e double é muito lento. Estou executando em uma calculadora de baixo desempenho, então float leva menos de 1 segundo e double leva pelo menos 5 segundos. Gostaria de permitir que o usuário escolhesse precisão em vez de velocidade ou velocidade em vez de precisão. Eu gostaria de obter algo assim:
int user_input;
scanf("%d", &user_input);
switch (user_input) {
case 0:
float z;
float c;
break;
case 1:
double z;
double c;
break;
}
for(int i=0;i<1920;i++){
for(int j=0;j<1080;j++){
z=0.0+0.0*I;
c=(i+j*I)/Zoom
}}
Resultado esperado: se o usuário digitar 0, todos os cálculos serão realizados usando floats, e se o usuário digitar 1, os cálculos serão realizados usando doubles.
Mas isso gera um erro: tipos conflitantes para 'z'; tem 'double', declaração anterior de 'z' com tipo 'float'.
Algo assim é possível em C?
Tentei criar duas variáveis diferentes para float e double, mas alterá-las em todo o código (tenho muito mais código) seria longo e tedioso.
Você não pode alterar o tipo de uma variável depois de compilada, mas pode usar uma macro semelhante a uma função para criar uma versão diferente da mesma função para cada tipo que você possa usar, sem precisar duplicar o código, por mais que você possa usar modelos em outros idiomas:
Se você tem um monte de funções como essa e não quer declarar absolutamente tudo como uma macro (já que colocar barras invertidas depois de cada linha é chato e torna mais difícil para os depuradores saberem em quais linhas as coisas estão definidas ), você pode fazer assim:
modelos.h:
principal.c:
Uma observação lateral: como chux apontou nos comentários,
I
é uma macro de complex.h, então você deve nomear outra coisa (a menos que essa macro seja o que você pretendia usar ).Você não pode. O compilador precisa saber o tipo da variável para gerar o código apropriado.
No seu cenário, eu criaria um programa que pudesse ser compilado em dois executáveis diferentes: um que usa
float
e outro que usadouble
.Outra possibilidade é criar duas versões de tudo. Na verdade, você não deseja escrever dois de tudo, então usaria a abordagem anterior para criar duas bibliotecas e, em seguida, carregaria a apropriada em tempo de execução.
A única solução viável em sistemas modernos que suportam vinculação dinâmica é compilar uma versão do seu programa usando
float
e outra usandodouble
. Então o programa principal carregará a versão correta da biblioteca dinâmica e executará a versão solicitada.