Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 27.12.2023
Сообщений: 5

Float даёт некорректный результат

27.12.2023, 07:08. Показов 1680. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Выражение в типе float вместо нужного результата (~0,99967) выдаёт 2799067,2
C#
1
2
3
4
5
6
7
float a1 = 1000.0f;
float b1 = 0.0001f;
float s = 0f;
s = s+ ((a1 + b1) * (a1 + b1) * (a1 + b1) -a1*a1*a1-b1*3*(a1*a1)) /(3*a1*(b1*b1)+(b1*b1));
Console.Write("Результат выражения задачи 3 float: ");
s.ToString();
Console.WriteLine(s);
Для сравнения, аналогичная функция в double работает корректно
C#
1
2
3
4
double a = 1000.0;
double b = 0.0001;
Console.Write("Результат выражения задачи 3 double: ");
Console.WriteLine((Math.Pow((a + b), 3) - (Math.Pow(a, 3) + b * 3 * Math.Pow(a, 2))) / (3 * a * Math.Pow(b, 2) + Math.Pow(b, 2)));
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2023, 07:08
Ответы с готовыми решениями:

String.LastIndexOf: некорректный результат
Доброго ... Во общем глючит у меня метод string.LastIndexOf() c дополнительными параметрами, начальной позиции и кол-во позиций для...

Некорректный результат при вычислениях
Где здесь косяк? не считает как надо :cry: double x=0, y=0; Console.WriteLine("Введите x"); ...

SHA-1 выдает некорректный результат
И так, мне нужно зашифровывать в sha1 текст. Я написал кое-что, но чот не работает..идеи?) static byte GetBytes(string str) { ...

21
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775
28.12.2023, 07:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от roach1967 Посмотреть сообщение
Тут скорее всего виновата оптимизация при компиляции
При компиляции из IL в машинные коды на этапе выполнения, разве что.

Для теста сделал отдельную сборку на 'netstandard 2.0', перенёс код вычисления в неё. Подключил в проекты на .NETFW48 и на .NET8. Результат повторяется, т.е. одна и та же (физически) библиотека даёт разные результаты при выполнении в разных .net-рантаймах.
1
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18376 / 14307 / 5370
Регистрация: 17.03.2014
Сообщений: 28,991
Записей в блоге: 1
29.12.2023, 01:35
Цитата Сообщение от kotelok Посмотреть сообщение
ри компиляции из IL в машинные коды на этапе выполнения, разве что.
Ради интереса решил посмотреть что покажет BenchmarkDotNet. Код на ассемблере в самом деле разный.
disassembly

.net 8.0
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
       vzeroupper
       vmovss    xmm0,dword ptr [rcx+8]
       vmovss    xmm1,dword ptr [rcx+0C]
       vaddss    xmm2,xmm0,xmm1
       vmulss    xmm3,xmm2,xmm2
       vmulss    xmm2,xmm3,xmm2
       vmulss    xmm3,xmm0,xmm0
       vmulss    xmm4,xmm3,xmm0
       vsubss    xmm2,xmm2,xmm4
       vmovss    xmm4,dword ptr [7FFCFA2E5B50]
       vmulss    xmm5,xmm1,xmm4
       vmulss    xmm3,xmm5,xmm3
       vsubss    xmm2,xmm2,xmm3
       vmulss    xmm0,xmm0,xmm4
       vmulss    xmm1,xmm1,xmm1
       vmulss    xmm0,xmm0,xmm1
       vaddss    xmm0,xmm0,xmm1
       vdivss    xmm0,xmm2,xmm0
       ret
; Total bytes of code 78

.net framework 4.8.1
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
       sub       rsp,18
       vzeroupper
       vmovss    xmm0,dword ptr [rcx+8]
       vmovaps   xmm1,xmm0
       vmovss    xmm2,dword ptr [rcx+0C]
       vaddss    xmm1,xmm1,xmm2
       vmovaps   xmm3,xmm1
       vmulss    xmm3,xmm3,xmm1
       vmulss    xmm1,xmm1,xmm3
       vmovaps   xmm3,xmm0
       vmulss    xmm3,xmm3,xmm0
       vmovaps   xmm4,xmm3
       vmulss    xmm4,xmm4,xmm0
       vsubss    xmm1,xmm1,xmm4
       vmovaps   xmm4,xmm2
       vmulss    xmm4,xmm4,dword ptr [7FFD2A85B570]
       vmulss    xmm3,xmm3,xmm4
       vsubss    xmm1,xmm1,xmm3
       vmulss    xmm0,xmm0,dword ptr [7FFD2A85B574]
       vmovaps   xmm3,xmm2
       vmulss    xmm2,xmm2,xmm3
       vmulss    xmm0,xmm0,xmm2
       vaddss    xmm2,xmm2,xmm0
       vmovaps   xmm0,xmm1
       vdivss    xmm0,xmm0,xmm2
       add       rsp,18
       ret
; Total bytes of code 137


c# benchmark
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[SimpleJob(RuntimeMoniker.Net48)]
[SimpleJob(RuntimeMoniker.Net80)]
[DisassemblyDiagnoser]
public class FloatBug
{
    [Params(1000.0f)]
    public float a1 { get; set; }
 
    [Params(0.0001f)]
    public float b1 { get; set; }
 
    [Benchmark]
    public float Calc()
    {
        return ((a1 + b1) * (a1 + b1) * (a1 + b1) -a1*a1*a1-b1*3*(a1*a1)) /(3*a1*(b1*b1)+(b1*b1));
    }
}

P.S. Код выполнялся на Intel Core i9-10900K.

Добавлено через 1 час 8 минут
Если кому-то интересно почему я использовал свойства вместо локальных переменных, то взгляните на ассемблерный код который генерируется разными CLR в этом случае:
Найди отличия
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## .NET 8.0.0 (8.0.23.53103), X64 RyuJIT AVX2
```assembly
; FloatBug.Calc()
       vzeroupper
       vmovss    xmm0,dword ptr [7FFCFA2F57A0]
       ret
; Total bytes of code 12
```
 
## .NET Framework 4.8.1 (4.8.9181.0), X64 RyuJIT VectorSize=256
```assembly
; FloatBug.Calc()
       vzeroupper
       vmovss    xmm0,dword ptr [7FFD2A85B270]
       ret
; Total bytes of code 13
```
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2023, 01:35

Некорректный результат при извлечении корня
Имеется кусок кода, значение qX и вопрос "почему?" Подскажите пжлст. vs 2012

Оператор Mod - некорректный результат программы
выдает какую-то лажу Console.WriteLine(221^20); //вывод: 201 как? должно быть 1

Простые операции с числами - некорректный результат
Помогите разобраться, почему неправильно считаетusing System; class Mikami { static void Main() { int y, k,...

Программа, решающая квадратные уравнения выдает некорректный результат
Пишу программу решающую квадратные уравнения, вроде все считает, считает правельно, но дает ответ допустим должно получится х1 = 1 х2 = -3...

Clipboard.GetText() – не дает результат
Помогите разобраться, Сlipboard.GetText(), не дает искомый результат Вот кусок кода: IntPtr hWnd =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
22
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru