Ryan Thomsen Ответов: 1

Почему scanf не принимает мой вклад?


Независимо от того, какие входные данные я даю этому коду, формат перепутан, и значения не соответствуют тому, что они должны быть:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <float.h>
#include <string.h>

double input1 = 0;
int main()
{
    double  celsius1, kelvin1, rankine1;
    scanf ("%g", &input1);
    celsius1 = ((5 *(input1 - 32))/9);
    rankine1 = (input1 + 459.67);
    kelvin1 = ((5*rankine1)/9);
    printf("%g degrees Fahrenheit\n%g degrees Celsius\n%g degrees Kelvin\n%g degrees Rankine", input1, celsius1, kelvin1, rankine1);
    return 0;
}


Вот выход для входа -460.67
-460.67
1.62382e-314 degrees Fahrenheit
-17.7778 degrees Celsius
255.372 degrees Kelvin
459.67 degrees Rankine
C:\Users\rthom\source\repos\ConsoleApplication1\Debug\ConsoleApplication1.exe (process 20956) exited with code 0.


Я также обязан использовать %g в этом задании для всех переменных, так что я никак не смогу это изменить.

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

Я пробовал инициализировать input1 снаружи и внутри main. Я также пытался объявить переменную в main, но независимо от того, что я сделал, это не сработало. Когда я инициализировал input1 внутри main и удалил &, я получаю исключение null pointer != result.

1 Ответов

Рейтинг:
9

Jon McKee

ссылка на scanf - C++ [^]

Диаграмма спецификатора находится ближе к нижней части. Это потому, что "%g" обрабатывает только поплавки (4 байта), а не двойники (8 байт). Вам нужно будет использовать "%lg" для двойников. Изменение переменных на float сработало для меня.


Ryan Thomsen

К сожалению, мое назначение указывает, что я должен использовать тип double для всех переменных и что я должен использовать спецификатор преобразования printers %g для отображения всех числовых значений. Есть ли обходной путь для этого?

Jon McKee

Надеюсь, ты это понял. Если инструкции действительно требуют, чтобы вы читали двойники, как если бы они были поплавками, как это, я бы спросил об этом учителя.

Этот код покажет вам, о чем я говорю, если вы дважды введете одно и то же значение. Поплавки и двойники имеют разные форматы памяти.

int main()
{
	double input1 = 0;
	
	//Different precision reads
	scanf("%g", &input1);
	printf("G (float) read: %g\n", input1);
	scanf("%lg", &input1);
	printf("LG (double) read: %g\n", input1);

	//Examining the hex of double vs float
	printf("\nRaw double: %-g\t\t0x", input1);
	for (int i = 0; i < sizeof(double); i++)
		printf("%02X", *(((unsigned char *)&input1) + i));
	printf("\n");
	float input2 = (float)input1;
	printf("Casted float: %-g\t\t0x", input2);
	for (int i = 0; i < sizeof(float); i++)
		printf("%02X", *(((unsigned char *)&input2) + i));
	printf("\n");
	return 0;
}

Технически вы можете это сделать, но это супер халтурно, может работать не на всех системах и никогда не рекомендуется:
scanf("%g", &input1);
printf("%g\n", *((float *)&input1));