From cb88dc17624ea23adec7fff961822498da774f84 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 1 Dec 2025 18:38:12 +0300 Subject: [PATCH 1/6] Add homework 12 --- src/hw_12-2_double/hw_12-2_double.c | 139 ++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/hw_12-2_double/hw_12-2_double.c diff --git a/src/hw_12-2_double/hw_12-2_double.c b/src/hw_12-2_double/hw_12-2_double.c new file mode 100644 index 0000000..a1a9d2c --- /dev/null +++ b/src/hw_12-2_double/hw_12-2_double.c @@ -0,0 +1,139 @@ +#include +#include +#include +#include + +// объединение для доступа к битам (записываем число в value, читаем биты через bits) +typedef union { + double value; + uint64_t bits; // unsigned long long (64 bits) +} DoubleConverter; + +// преобразование double в экспоненциальный формат (sm*2^p) +char* doubleExponential(double number) +{ + DoubleConverter converter; + converter.value = number; + + // извлекаем биты знака, порядка и мантиссы + uint64_t bits = converter.bits; + int sign_bit = (bits >> 63) & 1; // извлекаем знак (1бит) + int exponent_bits = (bits >> 52) & 0x7FF; // извлекаем порядок (11 бит) + uint64_t mantissa_bits = bits & 0xFFFFFFFFFFFFF; // извлекаем мантиссу (52 бита) + + // вычисляем реальный порядок + int exponent; + if (exponent_bits == 0) { + // денормализованное число (для него фиксированная экспонента -1022) + exponent = -1022; + } else { + // нормализованное число (вычисляем смещение на 1023) + exponent = exponent_bits - 1023; + } + + // создаем буфер для результата + char* result = (char*)malloc(256); // достаточно большой буфер + if (result == NULL) { + return NULL; // ошибка выделения памяти + } + + int pos = 0; // позиция в буфере + + // выводим знак + result[pos++] = sign_bit ? '-' : '+'; + + // выводим целую часть мантиссы + if (exponent_bits == 0) { + // для денормализованных чисел целая часть 0 + result[pos++] = '0'; + } else { + // для нормализованных чисел целая часть 1 + result[pos++] = '1'; + } + + // преобразуем дробную часть мантиссы в строку цифр + uint64_t remainder = mantissa_bits; + char decimal_digits[21]; // массив для хранения 20 цифр + 1 для округления + int digit_count = 0; + + // генерируем 21 цифру (20 для вывода + 1 для округления) + for (int i = 0; i < 21; i++) { + remainder *= 10; + uint64_t digit = remainder >> 52; // деление на 2^52 + remainder &= ((uint64_t)1 << 52) - 1; // остаток от деления на 2^52 + decimal_digits[i] = (char)('0' + digit); + digit_count++; + + // останавливаемся, если остаток стал 0 + if (remainder == 0) + break; + } + + // если сгенерировано 21 цифр, выполняем округление + if (digit_count == 21) { + // округляем 20-ю цифру на основе 21-й + int round_pos = 19; + while (round_pos >= 0 && decimal_digits[round_pos + 1] >= '5') { + if (decimal_digits[round_pos] < '9') { + decimal_digits[round_pos]++; + break; + } else { + decimal_digits[round_pos] = '0'; + round_pos--; + } + } + + digit_count = 20; // оставляем 20 цифр + } + + // удаляем незначащие нули с конца + while (digit_count > 0 && decimal_digits[digit_count - 1] == '0') { + digit_count--; + } + + // выводим дробную часть, если есть значащие цифры + if (digit_count > 0) { + result[pos++] = '.'; + for (int i = 0; i < digit_count; i++) { + result[pos++] = decimal_digits[i]; + } + } + + // выводим порядок + result[pos++] = '*'; + result[pos++] = '2'; + result[pos++] = '^'; + + // преобразуем порядок в строку + char exponent_str[12]; // достаточно для int + sprintf(exponent_str, "%d", exponent); + int exp_len = strlen(exponent_str); + for (int i = 0; i < exp_len; i++) { + result[pos++] = exponent_str[i]; + } + + result[pos] = '\0'; // завершаем строку + + return result; +} + +int main() +{ + double number; + printf("Enter a number: "); + scanf("%lf", &number); + + // получаем строку с результатом + char* result = doubleExponential(number); + + if (result != NULL) { + // выводим результат + printf("Result: %s\n", result); + + // освобождаем память + free(result); + } else + printf("Memory allocation error\n"); + + return 0; +} \ No newline at end of file From c41823f43d3889794921d8e8dcee5907be0772e1 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 1 Dec 2025 18:41:27 +0300 Subject: [PATCH 2/6] Use clang-format --- src/hw_12-2_double/hw_12-2_double.c | 62 ++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/src/hw_12-2_double/hw_12-2_double.c b/src/hw_12-2_double/hw_12-2_double.c index a1a9d2c..e3c5c05 100644 --- a/src/hw_12-2_double/hw_12-2_double.c +++ b/src/hw_12-2_double/hw_12-2_double.c @@ -1,5 +1,5 @@ -#include #include +#include #include #include @@ -14,13 +14,13 @@ char* doubleExponential(double number) { DoubleConverter converter; converter.value = number; - + // извлекаем биты знака, порядка и мантиссы uint64_t bits = converter.bits; int sign_bit = (bits >> 63) & 1; // извлекаем знак (1бит) int exponent_bits = (bits >> 52) & 0x7FF; // извлекаем порядок (11 бит) - uint64_t mantissa_bits = bits & 0xFFFFFFFFFFFFF; // извлекаем мантиссу (52 бита) - + uint64_t mantissa_bits = bits & 0xFFFFFFFFFFFFF; // извлекаем мантиссу (52 бита) + // вычисляем реальный порядок int exponent; if (exponent_bits == 0) { @@ -30,18 +30,18 @@ char* doubleExponential(double number) // нормализованное число (вычисляем смещение на 1023) exponent = exponent_bits - 1023; } - + // создаем буфер для результата - char* result = (char*)malloc(256); // достаточно большой буфер + char* result = (char*)malloc(256); // достаточно большой буфер if (result == NULL) { return NULL; // ошибка выделения памяти } - - int pos = 0; // позиция в буфере - + + int pos = 0; // позиция в буфере + // выводим знак result[pos++] = sign_bit ? '-' : '+'; - + // выводим целую часть мантиссы if (exponent_bits == 0) { // для денормализованных чисел целая часть 0 @@ -50,25 +50,25 @@ char* doubleExponential(double number) // для нормализованных чисел целая часть 1 result[pos++] = '1'; } - + // преобразуем дробную часть мантиссы в строку цифр uint64_t remainder = mantissa_bits; - char decimal_digits[21]; // массив для хранения 20 цифр + 1 для округления + char decimal_digits[21]; // массив для хранения 20 цифр + 1 для округления int digit_count = 0; - + // генерируем 21 цифру (20 для вывода + 1 для округления) for (int i = 0; i < 21; i++) { remainder *= 10; - uint64_t digit = remainder >> 52; // деление на 2^52 - remainder &= ((uint64_t)1 << 52) - 1; // остаток от деления на 2^52 + uint64_t digit = remainder >> 52; // деление на 2^52 + remainder &= ((uint64_t)1 << 52) - 1; // остаток от деления на 2^52 decimal_digits[i] = (char)('0' + digit); digit_count++; - + // останавливаемся, если остаток стал 0 if (remainder == 0) break; } - + // если сгенерировано 21 цифр, выполняем округление if (digit_count == 21) { // округляем 20-ю цифру на основе 21-й @@ -82,15 +82,15 @@ char* doubleExponential(double number) round_pos--; } } - - digit_count = 20; // оставляем 20 цифр + + digit_count = 20; // оставляем 20 цифр } - + // удаляем незначащие нули с конца while (digit_count > 0 && decimal_digits[digit_count - 1] == '0') { digit_count--; } - + // выводим дробную часть, если есть значащие цифры if (digit_count > 0) { result[pos++] = '.'; @@ -98,22 +98,22 @@ char* doubleExponential(double number) result[pos++] = decimal_digits[i]; } } - + // выводим порядок result[pos++] = '*'; result[pos++] = '2'; result[pos++] = '^'; - + // преобразуем порядок в строку - char exponent_str[12]; // достаточно для int + char exponent_str[12]; // достаточно для int sprintf(exponent_str, "%d", exponent); int exp_len = strlen(exponent_str); for (int i = 0; i < exp_len; i++) { result[pos++] = exponent_str[i]; } - - result[pos] = '\0'; // завершаем строку - + + result[pos] = '\0'; // завершаем строку + return result; } @@ -122,18 +122,18 @@ int main() double number; printf("Enter a number: "); scanf("%lf", &number); - + // получаем строку с результатом char* result = doubleExponential(number); - + if (result != NULL) { // выводим результат printf("Result: %s\n", result); - + // освобождаем память free(result); } else printf("Memory allocation error\n"); - + return 0; } \ No newline at end of file From 83238bee99c1d3598f9e30a49cecc8262e56d484 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 24 Nov 2025 21:03:26 +0300 Subject: [PATCH 3/6] Add configuration for clang --- .clang-format | 245 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..f00c630 --- /dev/null +++ b/.clang-format @@ -0,0 +1,245 @@ +--- +Language: Cpp +# BasedOnStyle: WebKit +AccessModifierOffset: -4 +AlignAfterOpenBracket: DontAlign +AlignArrayOfStructures: None +AlignConsecutiveAssignments: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: true +AlignConsecutiveBitFields: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveDeclarations: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveMacros: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCompound: false + AlignFunctionPointers: false + PadOperators: false +AlignConsecutiveShortCaseStatements: + Enabled: false + AcrossEmptyLines: false + AcrossComments: false + AlignCaseColons: false +AlignEscapedNewlines: Right +AlignOperands: DontAlign +AlignTrailingComments: + Kind: Never + OverEmptyLines: 0 +AllowAllArgumentsOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowBreakBeforeNoexceptSpecifier: Never +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: false +AllowShortCompoundRequirementOnASingleLine: true +AllowShortEnumsOnASingleLine: true +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: All +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterDefinitionReturnType: None +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: MultiLine +AttributeMacros: + - __capability +BinPackArguments: true +BinPackParameters: true +BitFieldColonSpacing: Both +BraceWrapping: + AfterCaseLabel: false + AfterClass: false + AfterControlStatement: Never + AfterEnum: false + AfterExternBlock: false + AfterFunction: true + AfterNamespace: false + AfterObjCDeclaration: false + AfterStruct: false + AfterUnion: false + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: true + SplitEmptyRecord: true + SplitEmptyNamespace: true +BreakAdjacentStringLiterals: true +BreakAfterAttributes: Leave +BreakAfterJavaFieldAnnotations: false +BreakArrays: true +BreakBeforeBinaryOperators: All +BreakBeforeConceptDeclarations: Always +BreakBeforeBraces: WebKit +BreakBeforeInlineASMColon: OnlyMultiline +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeComma +BreakInheritanceList: BeforeColon +BreakStringLiterals: true +ColumnLimit: 0 +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: false +DerivePointerAlignment: false +DisableFormat: false +EmptyLineAfterAccessModifier: Never +EmptyLineBeforeAccessModifier: LogicalBlock +ExperimentalAutoDetectBinPacking: false +FixNamespaceComments: false +ForEachMacros: + - foreach + - Q_FOREACH + - BOOST_FOREACH +IfMacros: + - KJ_IF_MAYBE +IncludeBlocks: Preserve +IncludeCategories: + - Regex: '^"(llvm|llvm-c|clang|clang-c)/' + Priority: 2 + SortPriority: 0 + CaseSensitive: false + - Regex: '^(<|"(gtest|gmock|isl|json)/)' + Priority: 3 + SortPriority: 0 + CaseSensitive: false + - Regex: '.*' + Priority: 1 + SortPriority: 0 + CaseSensitive: false +IncludeIsMainRegex: '(Test)?$' +IncludeIsMainSourceRegex: '' +IndentAccessModifiers: false +IndentCaseBlocks: false +IndentCaseLabels: false +IndentExternBlock: AfterExternBlock +IndentGotoLabels: true +IndentPPDirectives: None +IndentRequiresClause: true +IndentWidth: 4 +IndentWrappedFunctionNames: false +InsertBraces: false +InsertNewlineAtEOF: false +InsertTrailingCommas: None +IntegerLiteralSeparator: + Binary: 0 + BinaryMinDigits: 0 + Decimal: 0 + DecimalMinDigits: 0 + Hex: 0 + HexMinDigits: 0 +JavaScriptQuotes: Leave +JavaScriptWrapImports: true +KeepEmptyLinesAtTheStartOfBlocks: true +KeepEmptyLinesAtEOF: false +LambdaBodyIndentation: Signature +LineEnding: DeriveLF +MacroBlockBegin: '' +MacroBlockEnd: '' +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: Inner +ObjCBinPackProtocolList: Auto +ObjCBlockIndentWidth: 4 +ObjCBreakBeforeNestedBlockParam: true +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: true +PackConstructorInitializers: BinPack +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakOpenParenthesis: 0 +PenaltyBreakScopeResolution: 500 +PenaltyBreakString: 1000 +PenaltyBreakTemplateDeclaration: 10 +PenaltyExcessCharacter: 1000000 +PenaltyIndentedWhitespace: 0 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +PPIndentWidth: -1 +QualifierAlignment: Leave +ReferenceAlignment: Pointer +ReflowComments: true +RemoveBracesLLVM: false +RemoveParentheses: Leave +RemoveSemicolon: false +RequiresClausePosition: OwnLine +RequiresExpressionIndentation: OuterScope +SeparateDefinitionBlocks: Leave +ShortNamespaceLines: 1 +SkipMacroDefinitionBody: false +SortIncludes: CaseSensitive +SortJavaStaticImport: Before +SortUsingDeclarations: LexicographicNumeric +SpaceAfterCStyleCast: false +SpaceAfterLogicalNot: false +SpaceAfterTemplateKeyword: true +SpaceAroundPointerQualifiers: Default +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCpp11BracedList: true +SpaceBeforeCtorInitializerColon: true +SpaceBeforeInheritanceColon: true +SpaceBeforeJsonColon: false +SpaceBeforeParens: ControlStatements +SpaceBeforeParensOptions: + AfterControlStatements: true + AfterForeachMacros: true + AfterFunctionDefinitionName: false + AfterFunctionDeclarationName: false + AfterIfMacros: true + AfterOverloadedOperator: false + AfterPlacementOperator: true + AfterRequiresInClause: false + AfterRequiresInExpression: false + BeforeNonEmptyParentheses: false +SpaceBeforeRangeBasedForLoopColon: true +SpaceBeforeSquareBrackets: false +SpaceInEmptyBlock: true +SpacesBeforeTrailingComments: 1 +SpacesInAngles: Never +SpacesInContainerLiterals: true +SpacesInLineCommentPrefix: + Minimum: 1 + Maximum: -1 +SpacesInParens: Never +SpacesInParensOptions: + InCStyleCasts: false + InConditionalStatements: false + InEmptyParentheses: false + Other: false +SpacesInSquareBrackets: false +Standard: Latest +StatementAttributeLikeMacros: + - Q_EMIT +StatementMacros: + - Q_UNUSED + - QT_REQUIRE_VERSION +TabWidth: 8 +UseTab: Never +VerilogBreakBetweenInstancePorts: true +WhitespaceSensitiveMacros: + - BOOST_PP_STRINGIZE + - CF_SWIFT_NAME + - NS_SWIFT_NAME + - PP_STRINGIZE + - STRINGIZE +... From 9995f0188e9fbb7cc82a376ad8ce09a6adb1342a Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 24 Nov 2025 21:04:58 +0300 Subject: [PATCH 4/6] Add dependabot.yml --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..58865cf --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: "weekly" From f3243166b8d5f97c42e4159b79158f7f559c6cf1 Mon Sep 17 00:00:00 2001 From: ada1ra Date: Mon, 24 Nov 2025 21:05:34 +0300 Subject: [PATCH 5/6] Add built-and-lint.yml --- .github/workflows/build-and-lint.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .github/workflows/build-and-lint.yml diff --git a/.github/workflows/build-and-lint.yml b/.github/workflows/build-and-lint.yml new file mode 100644 index 0000000..a2c12fd --- /dev/null +++ b/.github/workflows/build-and-lint.yml @@ -0,0 +1,14 @@ +name: Build and lint + +on: + - push + - pull_request + +jobs: + build-and-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Check format + run: | + find . -path ./build -prune -o -type f -name '*.[c|h]' -print | xargs clang-format-18 --style=file --dry-run -Werror From c8209ed2bf03a8796d6d838a5ece42246f8f18f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 11:28:08 +0000 Subject: [PATCH 6/6] Bump actions/checkout from 5 to 6 Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-and-lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-and-lint.yml b/.github/workflows/build-and-lint.yml index a2c12fd..6797f75 100644 --- a/.github/workflows/build-and-lint.yml +++ b/.github/workflows/build-and-lint.yml @@ -8,7 +8,7 @@ jobs: build-and-lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Check format run: | find . -path ./build -prune -o -type f -name '*.[c|h]' -print | xargs clang-format-18 --style=file --dry-run -Werror