Калькулятор windows неправильно считает

Калькулятор в Windows 10 неправильно считает?

Бывает в сети случаются курьезные ситуации и это не исключение. Пользователь Reddit под ником EvilDoesIt опубликовал информацию, которая свидетельствует о том, что калькулятор в Windows 10 работает неправильно. Судя по скриншоту, программа неправильно считает значения. Если по идее результат должен был равняется 8-ми, он получается равен 12-ти. Пользователю практически сразу же ответили и при этом отметили, что для того чтобы он правильно считал по формуле нужно перейти в инженерный режим. И все бы ничего, если бы обсуждение не затянулось на почти 700 сообщений при этом Интернет-ресурсы начали пестрить заголовками о том, что калькулятор в Windows 10 не умеет правильно считать, но так ли это на самом деле? Естественно нет. Тогда почему в одном режиме калькулятор получает цифру 8, а в другом – 12. Все очень просто.

В первом случае калькулятор просто-напросто считает числа последовательно. Возьмите любой бухгалтерский калькулятор и поверьте он точно также посчитает, как и здесь. Точно также посчитает калькулятор и на ранних версиях Windows, просто не будет записана последовательность действий, как это сделано в Windows 10. Видно это многих заводит в заблуждение. Если вы все-равно смирится с этим не можете, то в первое выражение дорисуйте виртуальные скобочки и все станет на свои места. У стандартного калькулятор просто не стоит задачи считать по формуле, он просто считает это последовательно и все свои действия записывает в журнал. Инженерный же калькулятор работает по-другому. Как только вы ставите умножить или разделить, или ставите фигурные скобочки для какого-то выражения (в стандартном калькуляторе так нельзя кстати), то калькулятор заново пересчитывает это выражение. И да, как раз-таки инженерный калькулятор считает математически верно, в отличие от стандартного, где считается последовательность выражений. Думаю, с этим понятно.

Кстати, подобное уже всплывало месяца два назад в социальной сети ВКонтакте, когда тоже говорили, что калькулятор Windows 10 неправильно считает. Но тогда эта тема быстра заглохла, а теперь она опять всплывает с новой силой и к сожалению, многие в это верят. Если уже появляется подобная информация, то для начала нужно подумать головой: “А почему он так считает и было ли раньше такое, и так далее?” Не ну вы представьте, если бы калькулятор считал неправильно, это поставило бы под сомнение как софтверную часть компьютера, так и хардверную. А так как большие умы молчат, значит и там, и там все нормально. Думайте перед тем, как что-то заявлять.

Подсчитаем баги в калькуляторе Windows

Содержание

На днях компания Microsoft открыла исходный код калькулятора. Это приложение входило во все версии операционной системы Windows. Исходный код разных проектов Microsoft достаточно часто открывался за последние годы, но новость о калькуляторе в первый же день просочилась даже в нетехнологические средства массовой информации. Что ж, это популярная, но очень маленькая программа на языке C++. Тем не менее, статический анализ кода с помощью PVS-Studio выявил подозрительные места в проекте.

Читайте также:  Ubuntu one gnome linux

Введение

Калькулятор Windows наверняка знаком каждому пользователю этой операционной системы и не требует особого представления. Теперь же любой пользователь может изучить исходный код калькулятора на GitHub и предложить свои улучшения.

Общественность, например, уже обратила внимание на такую функцию:

которая логирует текст из буфера обмена и, возможно, отправляет его на серверы Microsoft. Но эта заметка не об этом. Хотя подозрительных примеров кода будет много.

Мы проверили исходный код калькулятора с помощью статического анализатора PVS-Studio. Так как код написан на нестандартном C++, многие постоянные читатели блога анализатора усомнились в возможности анализа, но это оказалось возможным. C++/CLI и C++/CX поддерживаются анализатором. Некоторые диагностики выдали ложные предупреждения из-за этого, но ничего критичного не произошло, что помешало бы воспользоваться этим инструментом.

Обзоры ошибок в других проектах:

Возможно, вы пропустили новости и о других возможностях PVS-Studio, поэтому хочу напомнить, что кроме проектов на языках C и C++, можно проанализировать код и на языках C# и Java.

Про неправильное сравнение строк

V547 Expression ‘m_resolvedName == L»en-US»‘ is always false. To compare strings you should use wcscmp() function. Calculator LocalizationSettings.h 180

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

Дело в том, что здесь неправильно сравниваются строки. Получилось сравнение указателей вместо значений строк. Сравнивается адрес массива символов с адресом строкового литерала. Указатели всегда неравны, поэтому условие всегда ложно. Для правильного сравнения строк следует использовать, например, функцию wcscmp.

Кстати, пока я пишу эту статью, в заголовочном файле массив символов m_resolvedName превратился в полноценную строку типа std::wstring. И теперь сравнение работает правильно. К моменту, когда вы будете читать эту статью, скорее всего, многие другие ошибки тоже будут исправлены благодаря энтузиастам и таким исследованиям, как это.

Утечка памяти в нативном коде

V773 The function was exited without releasing the ‘temp’ pointer. A memory leak is possible. CalcViewModel StandardCalculatorViewModel.cpp 529

Мы видим указатель temp, ссылающийся на массив из 100 элементов, под который выделена динамическая память. К сожалению, память освобождается всего в одном месте функции, во всех остальных местах возникает утечка памяти. Она не очень большая, но это всё равно ошибка для C++ кода.

Неуловимое исключение

V702 Classes should always be derived from std::exception (and alike) as ‘public’ (no keyword was specified, so compiler defaults it to ‘private’). CalcManager CalcException.h 4

Анализатор обнаружил класс, унаследованный от класса std::exception через модификатор private (модификатор по умолчанию, если ничего не указано). Проблема такого кода заключается в том, что при попытке поймать общее исключение std::exception исключение типа CalcException будет пропущено. Такое поведение возникает потому, что приватное наследование исключает неявное преобразование типов.

Пропущенный день

V719 The switch statement does not cover all values of the ‘DateUnit’ enum: Day. CalcViewModel DateCalculator.cpp 279

Подозрительно, что в switch не рассмотрен случай с DateUnit::Day. Из-за этого в календарь (переменная m_calendar) не добавляется значение, связанное с днём, хотя метод AddDays у календаря присутствует.

Ещё несколько подозрительных мест с другим перечислением:

  • V719 The switch statement does not cover all values of the ‘eANGLE_TYPE’ enum: ANGLE_RAD. CalcManager trans.cpp 109
  • V719 The switch statement does not cover all values of the ‘eANGLE_TYPE’ enum: ANGLE_RAD. CalcManager trans.cpp 204
  • V719 The switch statement does not cover all values of the ‘eANGLE_TYPE’ enum: ANGLE_RAD. CalcManager trans.cpp 276
Читайте также:  Файловая система mac os apfs

Подозрительные сравнение вещественных чисел

V550 An odd precise comparison: ratio == threshold. It’s probably better to use a comparison with defined precision: fabs(A — B) Epsilon. CalcManager UnitConverter.cpp 778

  • V550 An odd precise comparison. It’s probably better to use a comparison with defined precision: fabs(A — B) Epsilon. CalcManager UnitConverter.cpp 820
  • V550 An odd precise comparison: conversionTable[m_toType].ratio == 1.0. It’s probably better to use a comparison with defined precision: fabs(A — B) Epsilon. CalcManager UnitConverter.cpp 1000
  • V550 An odd precise comparison: sizeToUse != 0.0. It’s probably better to use a comparison with defined precision: fabs(A — B) > Epsilon. CalcViewModel LocalizationService.cpp 270
  • V550 An odd precise comparison: sizeToUse != 0.0. It’s probably better to use a comparison with defined precision: fabs(A — B) > Epsilon. CalcViewModel LocalizationService.cpp 289
  • V550 An odd precise comparison: sizeToUse != 0.0. It’s probably better to use a comparison with defined precision: fabs(A — B) > Epsilon. CalcViewModel LocalizationService.cpp 308
  • V550 An odd precise comparison: sizeToUse != 0.0. It’s probably better to use a comparison with defined precision: fabs(A — B) > Epsilon. CalcViewModel LocalizationService.cpp 327
  • V550 An odd precise comparison: stod(stringToLocalize) == 0. It’s probably better to use a comparison with defined precision: fabs(A — B) starting, что очень странно, ведь туда изначально передали значение false.

    Избыточность

    V560 A part of conditional expression is always true: NumbersAndOperatorsEnum::None != op. CalcViewModel UnitConverterViewModel.cpp 991

    Переменная op уже сравнивалась со значением NumbersAndOperatorsEnum::None и дублирующую проверку можно удалить.

    V728 An excessive check can be simplified. The ‘(A && B) || (!A && !B)’ expression is equivalent to the ‘bool(A) == bool(B)’ expression. Calculator Calculator.xaml.cpp 239

    Это гигантское условное выражение изначально имело ширину 218 символов, но я разбил его на несколько строк для демонстрации предупреждения. А переписать код можно до такого короткого и, главное, читабельного варианта:

    V524 It is odd that the body of ‘ConvertBack’ function is fully equivalent to the body of ‘Convert’ function. Calculator BooleanNegationConverter.cpp 24

    Анализатор обнаружил две функции, которые реализованы одинаково. По названиям функций Convert и ConvertBack можно предположить, что они должны выполнять разные действия, но разработчикам виднее.

    Заключение

    Наверное, каждый открытый проект от Microsoft давал нам возможность показать важность применения методологии статического анализа. Даже на таких маленьких проектах, как калькулятор. В таких крупных компаниях, как Microsoft, Google, Amazon и других, работает много талантливых программистов, но они такие же люди, которые делают ошибки в коде. Применение инструментов статического анализа кода — один из хороших способов повысить качество программ в любых командах разработчиков.

    Проверь свой «Калькулятор», скачав PVS-Studio и попробовав на своём проекте. 🙂

    Найдите ошибки в своем C, C++, C# и Java коде

    Предлагаем попробовать проверить код вашего проекта с помощью анализатора кода PVS-Studio. Одна найденная в нём ошибка скажет вам о пользе методологии статического анализа кода больше, чем десяток статей.

    Почему не работает калькулятор Windows 10

    При работе с системой можно столкнуться с разного рода проблемами. В «десятке» их довольно много, но решит их можно. Одной из дефектов системы является ошибки, не работает калькулятор Windows 10. В калькулятор мы можем совершать быстрые расчеты, чтобы не тратить время. Конечно, можно воспользоваться и смартфоном, но некоторым в данный момент может быть доступен только десктопный калькулятор.

    Читайте также:  Тупит windows 10 pro

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

    Как найти калькулятор на Windows 10

    Сейчас вряд ли этот вопрос имеет актуальность, так как с Windows 10 уже многие разобрались. Что-то найти в системе можно через Пуск. Открываете его и слева листаем до приложения «Калькулятор». Можно ввести в поиске и мгновенно отобразится нужный результат.

    Если там калькулятора нет, а в поиске он почему-то не отображается, используйте проводник. Зайдите на системный диск и следуйте по пути: C:\ Windows\System32\. Там найдите приложение calc.exe. Даже значок будет соответствующий.

    Наконец, отсутствие приложения во всех перечисленных местах будет говорить о том, что «Калькулятор» удален или из-за багов системы и вирусов он скрыт.

    Так как калькулятор является системным ПО, тогда прочитайте статью по удалению и сбросу приложений Windows 10.

    Исправляем проблему, когда не работает калькулятор Windows 10

    Самый простой способ избавиться от проблемки – сбросить приложение. Заходим в параметры системы (нажимаем комбинацию «Win+I») дальше переходим в раздел «Приложения».

    Заходим на вкладку «Приложения и возможности» ищем среди списка справа калькулятор. Нажимаем по нему и щелкаем по пункту «Дополнительные параметры».

    Появляется окошко, где жмём кнопку «Сбросить». А потом подтверждаем действие.

    Таким образом, мы сбросить кэш приложения, как бы вернем его в исходное состояние.

    Если это не помогло, попробуйте перезагрузить компьютер и открыть приложение от имени администратора. А еще, отключите временно, но UAC учетных записей.

    Вышеперечисленные действия не помогли? Прочитайте статью Почему не работают приложения Windows 10, возможно, там вы найдёте ответ.

    Установка аналогичного калькулятора на Windows 10

    Чтобы скачать и установить аналогичный калькулятор, воспользуемся магазином Windows. Зайдите в него и введите в поиске соответствующее слово или фразу. В результатах вы увидите множество калькуляторов, некоторые из которых имеют больше возможностей, чем стандартное приложение.

    Второй вариант – ввести в поисковике ключевую фразу и найти какой-нибудь калькулятор для Windows. Например, есть программка – Old Calculator для Windows 10. Это приложение возвращает калькулятор от Windows 7. Думаю, кому-то это будет интересно.

    Скачать программу можно с официального сайта разработчика: http://winaero.com/blog/get-calculator-from-windows-8-and-windows-7-in-windows-10/. Там есть и другие полезные приложения для «десятки» и интересные статьи.

    Дополнительные действия, если не работает калькулятор Windows 10

    Если у вас возникла подобная проблемка, тогда выполните следующие действия:

    • Вспомните, что вы делали недавно в системе и приведите её в исходное состояние;
    • Запустите от имени администратор командную строку и введите команду: sfc /scannow .
    • Если результата не дало, в той же командной строке введите:
      DISM.exe /Online /Cleanup-image /Restorehealth – это восстановление образа системы.
    • Попробуйте создать другую учетную запись и открыть калькулятор там.
    • Удалите недавно установленные программы и отключите антивирус.
    • Используйте восстановление системы.

    Вот мы разобрали много действий, касающихся лишь одно приложения в такой большой системе, как Windows 10. Поэтому материалов еще будет очень много и не забывайте следить за выходом новых материалов.

  • Оцените статью
    Adblock
    detector