// 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;
}
якщо відʼємне {
результат = -результат;
}
вихід::вміст = результат;
вернути так;
}
}