С Новым годом! Форум программистов, компьютерный форум, киберфорум
PowerShell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213

Чойта? (0.1+0.2)

01.12.2022, 10:03. Показов 1610. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Попалось тут на форуме:
PowerShell
1
(0.1 + 0.2) -eq 0.3 #False
и чего?
В смысле, беда не только в powershell, но хоть какое-то вменяемое объяснение существует?
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
01.12.2022, 10:37
Лучший ответ Сообщение было отмечено YuS_2 как решение

Решение

Цитата Сообщение от YuS_2 Посмотреть сообщение
(0.1 + 0.2
Да, миллиарды вложены:
PowerShell
1
0.1 + 0.2 - 0.3    # 5,55111512312578E-17
Добавлено через 10 минут
PowerShell
1
[decimal] (0.1 + 0.2) -eq 0.3
2
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
01.12.2022, 10:58
Лучший ответ Сообщение было отмечено YuS_2 как решение

Решение

Цитата Сообщение от YuS_2 Посмотреть сообщение
хоть какое-то вменяемое объяснение существует
конечно, достаточно погуглить про арифметику чисел с плавающей точкой

Добавлено через 9 секунд
https://habr.com/ru/post/112953/
3
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
01.12.2022, 12:37  [ТС]
Цитата Сообщение от lesser Посмотреть сообщение
5,55111512312578E-17
Да! Точно, там же [double]... и это, кстати, скорее всего имеет отношение к тому нашему обсуждению...

Цитата Сообщение от Welemir1 Посмотреть сообщение
про арифметику чисел с плавающей точкой
Верно! Спасибо!
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,830
01.12.2022, 12:42
военное время тоже надо учитывать
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
01.12.2022, 12:49  [ТС]
а как же... его всегда считаем...
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,830
01.12.2022, 13:00
короче, в скриптовом языке 0.1 + 0.2 должно быть 0.3,

а 24529853627652654237645235 + 726352764726432765276543 должно быть 25256206392379087002921778

вместо жалкое бормотания про арифметику плавающей точки и переполнение целых чисел

Добавлено через 4 минуты
wolframscript
0.1 + 0.2 == 0.3
Output:
True

Raku
0.1 + 0.2 == 0.3
Output
True
1
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
01.12.2022, 13:19  [ТС]
Цитата Сообщение от volodin661 Посмотреть сообщение
короче, в скриптовом языке 0.1 + 0.2 должно быть 0.3,
а 24529853627652654237645235 + 726352764726432765276543 должно быть 25256206392379087002921778
Дык:

- так и есть!
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
01.12.2022, 13:22  [ТС]
и вот так:
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
01.12.2022, 14:10
Это оказывается действительно проблема не только powershell. Поэтому в операциях сравнения нужно не забывать к левому элементу прибавлять суффикс 'd' (по правилу динамической типизации "справа налево", значение справа принимает, если возможно, тип слева)

PowerShell
1
(0.1d + 0.2) -eq 0.3
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
01.12.2022, 14:43  [ТС]
Цитата Сообщение от lesser Посмотреть сообщение
Поэтому в операциях сравнения нужно не забывать к левому элементу прибавлять суффикс 'd'
Уточнение: не суффикс прибавлять, а принудительно типизировать (как минимум, левый операнд), а способ - это уже вторично...

Добавлено через 4 минуты
Преобразования
0
 Аватар для volodin661
6671 / 2264 / 346
Регистрация: 10.12.2013
Сообщений: 7,830
01.12.2022, 15:52
двум учёным операндам нужен третий операнд

0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
01.12.2022, 20:23
YuS_2, принудительная типизация стала бы очень затратной. И, к слову, это вовсе не баг, а вполне "адекватное" поведение. Такой же код, что в C++:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
#include <iostream>
 
int main(void) {
  std::cout << (.1 + .2 == .3) << std::endl;
  return 0;
}

что в C#:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
using System;
 
internal sealed class Program {
  static void Main() {
    Console.WriteLine("{0}", .1 + .2 == .3);
  }
}

вполне резонно вернёт false.

lesser, хоть слева:
PowerShell
1
(.1d+.2)-eq.3
хоть справа:
PowerShell
1
(.1+.2)-eq.3d
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
01.12.2022, 21:46
Цитата Сообщение от greg zakharov Посмотреть сообщение
хоть слева, хоть справа
Наверное я перепутал, может с корвертацией типов, где левая часть является целевым типом для правой, например:
PowerShell
1
2
1 -eq '1.0'
'1.0' -eq 1
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
02.12.2022, 07:38  [ТС]
Цитата Сообщение от greg zakharov Посмотреть сообщение
принудительная типизация стала бы очень затратной.
дык, тут затратность не приоритетна... математика в программировании, в идеале, должна также работать по правилам математики, а не приводить к неверному результату из-за ограничений программно-аппаратного уровня...

Цитата Сообщение от greg zakharov Посмотреть сообщение
И, к слову, это вовсе не баг, а вполне "адекватное" поведение.
Тут я, всё же, больше на стороне такого мнения:
Цитата Сообщение от volodin661 Посмотреть сообщение
вместо жалкое бормотания про арифметику плавающей точки и переполнение целых чисел
А принудительная (явная) типизация, наверное (утверждать не берусь, не исследовал), не более затратна, чем неявная, которая работает в powershell:
Code
1
2
PS_7.3.0> (0.3).gettype().name
Double
Почему Double? Почему не Float или не Decimal, раз уж числа с плавающей точкой не являются точными?
0
1658 / 273 / 66
Регистрация: 03.06.2020
Сообщений: 689
02.12.2022, 08:39
Что-то у них там (в 7.3) явно не в порядке с типизацией. Особенно доставляет pscustombject c floating, которые в виндоус округляются до сотых, а в линукс до тысячных:

PowerShell
1
2
3
4
5
PS > [pscustomobject] @{ a = 1.0; b = 1.12; c = 1.1234567 }
 
    a     b     c
    -     -     -
1,000 1,120 1,123
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
02.12.2022, 10:02  [ТС]
Цитата Сообщение от lesser Посмотреть сообщение
Наверное я перепутал, может с корвертацией типов, где левая часть является целевым типом для правой
Не совсем перепутал...
Powershell автоматически пытается привести тип результата к типу левого операнда, например:
PowerShell
1
2
PS_7.3.0> "abc"+10
abc10
но в случае работы с числами:
Цитата Сообщение от lesser Посмотреть сообщение
Особенно доставляет pscustombject c floating, которые в виндоус округляются до сотых, а в линукс до тысячных
А посмотри как округляет в PS 5.1, там округления просто нет (что, в общем-то логичнее, имхо).
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
02.12.2022, 10:27
YuS_2, могу лишь посоветовать почитать относительно организации памяти, и поразмышлять над результатами. Это — фундаментальные издержки.
0
Любознательный
 Аватар для YuS_2
7404 / 2254 / 360
Регистрация: 10.03.2016
Сообщений: 5,213
02.12.2022, 10:38  [ТС]
Цитата Сообщение от greg zakharov Посмотреть сообщение
Это — фундаментальные издержки.
Да я же не спорю... и написал потому:
Цитата Сообщение от YuS_2 Посмотреть сообщение
в идеале
Здесь у меня возникло недопонимание автовыбора типа, с соответствующим результатом, отличающимся от фундаментальных законов математики...
А издержки понятны, особенно связанные с архитектурой процессоров и памяти...
Но таки разработчикам, как ПО, так и аппаратной части, стремиться необходимо к идеалу, несмотря на естественные ограничения.
0
Покинул форум
3700 / 1483 / 355
Регистрация: 07.05.2015
Сообщений: 2,903
02.12.2022, 11:18
YuS_2, а как разработчик может повлиять на архитектуру по-твоему? Писать вспомогательный драйвер? Тогда как абстрагироваться от конкретной архитектуры? На программном уровне это можно сделать задавая строгие ограничения, но тогда при вычислениях, требующих большей точности, последних ожидать не придётся. Как итог, имеем такой вот «компромисс». В математике, между прочим, также есть ряд «специфических» мест, ведущих к неоднозначности, но они нивелируются посредством постулатов и аксиом. Вспомни, например, доказательство Ванцеля относительно трисекции угла, тем не менее при определенных условиях она возможна. И это тоже своего рода компромисс.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru