// 2025-2026 Богданович Давид Когут Прихожденко (кдб.дійсність.укр)

взяти означення мавка/машина;
взяти означення мавка/розбирач;

простір мавка {
  дія розібрати_число_з_кд(М: адреса<Машина>, значення: кд, вихід: адреса<р64>) -> логічне {
    змінна відʼємне = ні;
    змінна результат = р64(0.0);
    змінна п = природне(0);
    змінна знак = п8(0);

    якщо значення.дані[п] == мавка::розбирач::КД_РИСКА { // -
      відʼємне = так;

      п += 1;
    }

    знак = значення.дані[п];

    поки п < значення.розмір {
      знак = значення.дані[п];

      якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
        результат = результат * 10.0 + (р64(знак) - р64(мавка::розбирач::КД_0));
      } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
        // ігноруємо
      } інакше якщо знак == мавка::розбирач::КД_КРАПКА { // .
        п += 1;

        знак = значення.дані[п];

        змінна дробна_частина = р64(0.0);
        змінна дільник = р64(1.0);

        поки п < значення.розмір {
          знак = значення.дані[п];

          змінна ігнор = ні;

          якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
            дробна_частина = дробна_частина * 10.0 + (р64(знак) - р64(мавка::розбирач::КД_0));
          } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
            ігнор = так;
          } інакше якщо знак == мавка::розбирач::КД_мала_буква_е { // е (наукова нотація)
            результат = результат + дробна_частина / дільник;

            якщо відʼємне {
              результат = -результат;
            }

            // Розбираємо експоненту
            п += 1;

            якщо п >= значення.розмір {
              вернути ні;
            }

            змінна експонента_відʼємна = ні;
            знак = значення.дані[п];

            якщо знак == мавка::розбирач::КД_РИСКА { // -
              експонента_відʼємна = так;
              п += 1;
            } інакше якщо знак == мавка::розбирач::КД_ХРЕСТИК { // +
              п += 1;
            }

            якщо п >= значення.розмір {
              вернути ні;
            }

            змінна експонента = ц32(0);

            поки п < значення.розмір {
              знак = значення.дані[п];

              якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
                експонента = експонента * 10 + (ц32(знак) - ц32(мавка::розбирач::КД_0));
              } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
                // ігноруємо
              } інакше {
                вернути ні;
              }

              п += 1;
            }

            якщо експонента_відʼємна {
              експонента = -експонента;
            }

            // Застосовуємо експоненту: результат * 10**експонента
            змінна степінь = мавка::піднести_до_степеня_р64(М, 10.0, р64(експонента));

            результат = результат * степінь;

            вихід::вміст = результат;

            вернути так;
          } інакше {
            вернути ні;
          }

          п += 1;

          якщо не ігнор {
            дільник = дільник * 10.0;
          }
        }

        результат = результат + дробна_частина / дільник;

        якщо відʼємне {
          результат = -результат;
        }

        вихід::вміст = результат;

        вернути так;
      } інакше якщо знак == мавка::розбирач::КД_мала_буква_е { // е (наукова нотація)
        якщо відʼємне {
          результат = -результат;
        }

        // Розбираємо експоненту
        п += 1;

        якщо п >= значення.розмір {
          вернути ні;
        }

        змінна експонента_відʼємна = ні;
        знак = значення.дані[п];

        якщо знак == мавка::розбирач::КД_РИСКА { // -
          експонента_відʼємна = так;
          п += 1;
        } інакше якщо знак == мавка::розбирач::КД_ХРЕСТИК { // +
          п += 1;
        }

        якщо п >= значення.розмір {
          вернути ні;
        }

        змінна експонента = ц32(0);

        поки п < значення.розмір {
          знак = значення.дані[п];

          якщо знак >= мавка::розбирач::КД_0 і знак <= мавка::розбирач::КД_9 {
            експонента = експонента * 10 + (ц32(знак) - ц32(мавка::розбирач::КД_0));
          } інакше якщо знак == мавка::розбирач::КД_ПІДРИСКА { // _
            // ігноруємо
          } інакше {
            вернути ні;
          }

          п += 1;
        }

        якщо експонента_відʼємна {
          експонента = -експонента;
        }

        // Застосовуємо експоненту: результат * 10**експонента
        змінна степінь = мавка::піднести_до_степеня_р64(М, 10.0, р64(експонента));

        результат = результат * степінь;

        вихід::вміст = результат;

        вернути так;
      } інакше {
        вернути ні;
      }

      п += 1;
    }

    якщо відʼємне {
      результат = -результат;
    }

    вихід::вміст = результат;

    вернути так;
  }
}